Submitted URL: https://golem.de/
Effective URL: https://www.golem.de/
Submission: On March 17 via automatic, source alexatop100k

Summary

This website contacted 52 IPs in 8 countries across 33 domains to perform 199 HTTP transactions. The main IP is 77.247.84.129, located in Berlin, Germany and belongs to SYSELEVEN SysEleven GmbH, DE. The main domain is www.golem.de.
TLS certificate: Issued by GeoTrust RSA CA 2018 on July 27th 2018. Valid for: a year.
This is the only time www.golem.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 76 77.247.84.129 25291 (SYSELEVEN...)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
8 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.103.64 43407 (INFONLINE-AS)
2 2a00:1450:400... 15169 (GOOGLE)
1 13.35.253.85 16509 (AMAZON-02)
1 95.100.197.52 16625 (AKAMAI-AS)
3 10 23.45.237.209 20940 (AKAMAI-ASN1)
1 80.82.201.88 48173 (UNBELIEVA...)
2 2a00:1450:400... 15169 (GOOGLE)
6 2a00:1450:400... 15169 (GOOGLE)
10 172.217.21.194 15169 (GOOGLE)
5 2a00:1450:400... 15169 (GOOGLE)
1 213.19.162.31 26667 (RUBICONPR...)
1 173.241.240.220 36089 (OPENX-AS1)
5 2a00:1450:400... 15169 (GOOGLE)
4 2a00:1450:400... 15169 (GOOGLE)
11 136.243.3.132 24940 (HETZNER-AS)
1 2 91.215.100.40 43407 (INFONLINE-AS)
1 138.197.186.29 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
1 77.247.84.149 25291 (SYSELEVEN...)
1 1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 52.216.230.93 16509 (AMAZON-02)
2 13.35.253.115 16509 (AMAZON-02)
2 52.28.163.57 16509 (AMAZON-02)
1 2606:4700:30:... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
6 95.216.24.148 24940 (HETZNER-AS)
2 217.79.188.21 24961 (MYLOC-AS)
1 52.216.101.173 16509 (AMAZON-02)
1 13.35.253.41 16509 (AMAZON-02)
1 213.239.199.112 24940 (HETZNER-AS)
1 136.243.65.40 24940 (HETZNER-AS)
1 148.251.139.104 24940 (HETZNER-AS)
1 2 173.241.240.143 36089 (OPENX-AS1)
1 104.111.230.142 16625 (AKAMAI-AS)
3 5 95.100.198.56 16625 (AKAMAI-AS)
1 185.33.223.216 29990 (ASN-APPNEXUS)
2 2 172.217.16.194 15169 (GOOGLE)
1 104.109.68.123 20940 (AKAMAI-ASN1)
1 89.163.159.109 24961 (MYLOC-AS)
1 62.168.44.118 5588 (GTSCE GTS...)
4 52.211.144.109 16509 (AMAZON-02)
1 35.156.186.28 16509 (AMAZON-02)
1 2600:9000:200... 16509 (AMAZON-02)
1 54.77.75.246 16509 (AMAZON-02)
2 2 89.163.159.106 24961 (MYLOC-AS)
1 89.163.159.125 24961 (MYLOC-AS)
1 34.245.249.125 16509 (AMAZON-02)
199 52
Apex Domain
Subdomains
Transfer
97 golem.de
golem.de
www.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.3.damoh.golem.de
ssl.1.damoh.golem.de
2 MB
17 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
244 KB
11 meetrics.net
lb29.s400.meetrics.net
3 KB
11 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
7 KB
10 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
179 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
7 googletagservices.com
www.googletagservices.com
161 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 theadex.com
dmp.theadex.com
xpl.theadex.com
api.theadex.com
15 KB
4 adscale.de
hb.adscale.de Failed
ih.adscale.de
js.adscale.de
7 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
57 KB
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
2 KB
3 ioam.de
script.ioam.de
de.ioam.de
12 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 adition.com
ad2.adfarm1.adition.com
2 googleapis.com
imasdk.googleapis.com
82 KB
2 yieldlove-ad-serving.net
tracking.yieldlove-ad-serving.net
214 B
2 amazonaws.com
s3.amazonaws.com
1 KB
2 google-analytics.com
www.google-analytics.com
ssl.google-analytics.com
17 KB
2 rubiconproject.com
fastlane.rubiconproject.com
eus.rubiconproject.com
2 KB
2 google.de
adservice.google.de
348 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
673 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 yieldlab.net
ad.yieldlab.net
495 B
1 adnxs.com
ib.adnxs.com
850 B
1 2mdn.net
s0.2mdn.net
11 KB
1 radiantmediatechs.com
cdn.radiantmediatechs.com
2 KB
1 google.com
adservice.google.com
172 B
1 nuggad.net
si.nuggad.net
1 KB
1 mxcdn.net
s400.mxcdn.net
45 KB
1 yieldlove.com
cdn-a.yieldlove.com
102 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
60 KB
199 33
Domain Requested by
75 www.golem.de www.golem.de
11 lb29.s400.meetrics.net www.golem.de
10 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.golem.de
10 tracking.m6r.eu 3 redirects www.golem.de
tracking.m6r.eu
8 video.golem.de www.golem.de
text
7 www.googletagservices.com cdn.stroeerdigitalgroup.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
7 cpxl.golem.de www.golem.de
6 tt.onthe.io cdn.onthe.io
5 tpc.googlesyndication.com securepubads.g.doubleclick.net
5 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
4 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 ih.adscale.de 2 redirects js.adscale.de
3 hgc-cf-cache-1.svonm.com www.golem.de
text
2 uss.xplosion.de
2 xpl.theadex.com 2 redirects
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 cm.g.doubleclick.net 2 redirects
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 ssl.3.damoh.golem.de text
2 ad2.adfarm1.adition.com cdn.stroeerdigitalgroup.de
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 tracking.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 s3.amazonaws.com www.golem.de
text
2 de.ioam.de 1 redirects www.golem.de
2 adservice.google.de www.googletagservices.com
2 ads.golem.de www.golem.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 cdn.adrtx.net www.golem.de
1 cdn.emetriq.de ups.xplosion.de
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 dmp.theadex.com cdn.stroeerdigitalgroup.de
1 js.adscale.de cdn.stroeerdigitalgroup.de
1 ad.yieldlab.net www.golem.de
1 ib.adnxs.com www.golem.de
1 cdn.m6r.eu 1 redirects
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 ssl.1.damoh.golem.de text
1 s0.2mdn.net imasdk.googleapis.com
1 cdn.radiantmediatechs.com www.golem.de
1 stats.g.doubleclick.net www.golem.de
1 ssl.google-analytics.com 1 redirects
1 cpx.golem.de www.golem.de
1 www.google-analytics.com www.golem.de
1 cdn.onthe.io www.golem.de
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 fastlane.rubiconproject.com cdn-a.yieldlove.com
1 adservice.google.com www.googletagservices.com
1 si.nuggad.net cdn.stroeerdigitalgroup.de
1 s400.mxcdn.net cdn.stroeerdigitalgroup.de
1 cdn-a.yieldlove.com cdn.stroeerdigitalgroup.de
1 script.ioam.de www.golem.de
1 cdn.stroeerdigitalgroup.de www.golem.de
1 golem.de 1 redirects
0 hb.adscale.de Failed cdn-a.yieldlove.com
199 56
Subject Issuer Validity Valid
*.golem.de
GeoTrust RSA CA 2018
2018-07-27 -
2019-08-28
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
cdn-a.yieldlove.com
Amazon
2018-10-11 -
2019-11-11
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2018-09-27 -
2019-11-26
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2018-08-10 -
2019-09-09
a year crt.sh
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years crt.sh
*.google.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.openx.net
DigiCert ECC Secure Server CA
2018-04-03 -
2019-04-08
a year crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.onthe.io
Sectigo RSA Domain Validation Secure Server CA
2019-03-04 -
2020-05-02
a year crt.sh
*.google-analytics.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-12-03 -
2019-10-25
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2018-08-09 -
2019-09-09
a year crt.sh
tracking.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2019-03-04 -
2019-06-02
3 months crt.sh
radiantmediatechs.com
CloudFlare Inc ECC CA-2
2018-04-19 -
2019-04-19
a year crt.sh
*.googleapis.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
*.doubleclick.net
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
*.adfarm1.adition.com
AlphaSSL CA - SHA256 - G2
2017-05-03 -
2019-06-27
2 years crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-01-21 -
2019-04-21
3 months crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 20 frames:

Primary Page: https://www.golem.de/
Frame ID: 8236E385CED8B04E64FDDC9460F771DE
Requests: 176 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20190313/r20190131/show_ads_impl.js
Frame ID: DAA84430CC387A2DBDC67FF820D8A8A6
Requests: 1 HTTP requests in this frame

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

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525448&bpp=15&bdt=733&fdt=60&idt=59&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&correlator=8447921753257&rume=1&frm=20&pv=2&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=46842679232&dssz=40&mdo=0&mso=0&u_tz=0&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=453&ady=3984&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=636311223&ifi=4&uci=4.p7dm2z7uwl7p&fsb=1&xpc=YywuB2JAFw&p=https%3A//www.golem.de&dtd=75
Frame ID: 4C65848710FD52C1B467B0C2568DFF4C
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525463&bpp=8&bdt=748&fdt=82&idt=44&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=8447921753257&rume=1&frm=20&pv=1&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=184281632704&dssz=41&mdo=0&mso=0&u_tz=0&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=453&ady=4660&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=1823298079&ifi=5&uci=5.ijqkwpjo4syv&fsb=1&xpc=vHuqpht3WS&p=https%3A//www.golem.de&dtd=84
Frame ID: 48A0C40F60CF5751187023DE373C3850
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525471&bpp=9&bdt=756&fdt=82&idt=36&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=8447921753257&rume=1&frm=20&pv=1&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=184281632704&dssz=41&mdo=0&mso=0&u_tz=0&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=453&ady=5349&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=154924829&ifi=6&uci=6.we7v6ftu2jxi&fsb=1&xpc=SmHiIL0RzA&p=https%3A//www.golem.de&dtd=85
Frame ID: 5605E2430CA5CC980FF6BB586D342EA5
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html
Frame ID: C6673681DFF12E2BFC89263D66AFE896
Requests: 1 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.286.0_de.html
Frame ID: 74A2ED2ADA81581D6883F15709C957DA
Requests: 1 HTTP requests in this frame

Frame: https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Frame ID: 99E0D6331B0CEB9F9EE82479BF8C5098
Requests: 3 HTTP requests in this frame

Frame: https://ad2.adfarm1.adition.com/banner?sid=3843260&kid=2997060&wpt=H&ts=493750051&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjsuQ6LVbbC-YH3eKKKjSSc7dn0vYRP8L0hXYCBFzCkfpiaT8WXjxKR3od7Ydl2MakLySuoq7al26Eqr8gSXdYKBjtw_nw2dJyhkJh8RPjSucpT0fJUy4TWqIpteiP8PcAFQD4UViNcZ6SwI64IUGoNyB6Ena2D4B7Dovy5Zm9LZB_8Nqu4heSRVGDaQD3n_LasJUjta7LVTCl-zXiSXgvOPh3QTczqKfQnQCHjYuJcWMwNHhErL5OffJZt14en5iy4j8OT34PlkuYUtJ&sai=AMfl-YRSk4Cnsk6ACGN3SY4Y0_9uSn606zv8E1jm1RmDjSkcLAquM5vrNwFezq5YD33c5vsjcURfh-ZqzTXduS67IXRzwjbvk3SwoyL0bQk5&sig=Cg0ArKJSzNKPokaFZzI8EAE&urlfix=1&adurl=
Frame ID: 4485EDA245EA75C421813FD26B9621BC
Requests: 1 HTTP requests in this frame

Frame: https://ad2.adfarm1.adition.com/banner?sid=3843261]&kid=2997060&wpt=H&ts=493750051&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjsuQ6LVbbC-YH3eKKKjSSc7dn0vYRP8L0hXYCBFzCkfpiaT8WXjxKR3od7Ydl2MakLySuoq7al26Eqr8gSXdYKBjtw_nw2dJyhkJh8RPjSucpT0fJUy4TWqIpteiP8PcAFQD4UViNcZ6SwI64IUGoNyB6Ena2D4B7Dovy5Zm9LZB_8Nqu4heSRVGDaQD3n_LasJUjta7LVTCl-zXiSXgvOPh3QTczqKfQnQCHjYuJcWMwNHhErL5OffJZt14en5iy4j8OT34PlkuYUtJ&sai=AMfl-YRSk4Cnsk6ACGN3SY4Y0_9uSn606zv8E1jm1RmDjSkcLAquM5vrNwFezq5YD33c5vsjcURfh-ZqzTXduS67IXRzwjbvk3SwoyL0bQk5&sig=Cg0ArKJSzNKPokaFZzI8EAE&urlfix=1&adurl=
Frame ID: 19A798B761B687B814A5240CF5C37B44
Requests: 1 HTTP requests in this frame

Frame: https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Frame ID: 527F2163CAC6D0E18949A128C5A57344
Requests: 3 HTTP requests in this frame

Frame: https://www.googletagservices.com/tag/js/gpt.js
Frame ID: 0459808174C36140DD11678CE1C5D61C
Requests: 11 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html
Frame ID: EEB1ECD0FA822095C441C392889B5235
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html?n=1
Frame ID: BD7BE831802063BCD607E5D72922E14B
Requests: 1 HTTP requests in this frame

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

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

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

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

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

Screenshot


Page URL History Show full URLs

  1. https://golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Detected technologies

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

Overall confidence: 100%
Detected patterns
  • env /pbjs/i

Overall confidence: 100%
Detected patterns
  • env /^google_ad_/i
  • env /^__google_ad_/i
  • env /^Goog_AdSense_/i

Overall confidence: 100%
Detected patterns
  • env /^gaGlobal$/i

Overall confidence: 100%
Detected patterns
  • env /^googletag$/i

Overall confidence: 100%
Detected patterns
  • env /^szmvars$/i
  • env /^iam_data$/i

Overall confidence: 100%
Detected patterns
  • env /^jQuery$/i

Page Statistics

199
Requests

98 %
HTTPS

31 %
IPv6

33
Domains

56
Subdomains

52
IPs

8
Countries

2812 kB
Transfer

5652 kB
Size

2
Cookies

Page URL History

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

  1. https://golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 21
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 57
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2Fn.a.&cb=000e&i2=000ed36d44830c5035c8e968d&ep=1579469800&vr=412&id=s9k4qs&i3=000ed36d44830c5035c8e968d%3A1579286925619%3A1552848525619%3A.golem.de%3A1%3A1552848525619!hukl54&n1=1&dntt=0&lt=1552848525620&ev=&cs=qa7bq6&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2Fn.a.&cb=000e&i2=000ed36d44830c5035c8e968d&ep=1579469800&vr=412&id=s9k4qs&i3=000ed36d44830c5035c8e968d%3A1579286925619%3A1552848525619%3A.golem.de%3A1%3A1552848525619%21hukl54&n1=1&dntt=0&lt=1552848525620&ev=&cs=qa7bq6&mo=1&sr=71
Request Chain 112
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=453676987&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&utmhid=2033765541&utmr=-&utmp=%2F&utmht=1552848525721&utmac=UA-518800-2&utmcc=__utma%3D21769261.759614550.1552848525.1552848525.1552848525.1%3B%2B__utmz%3D21769261.1552848526.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=733786880&utmredir=1&utmu=qRQAAAAAAAAAAAAAAAQAAAAE~ HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=759614550.1552848525&jid=733786880&_v=5.7.2&z=453676987
Request Chain 181
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1 HTTP 302
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Request Chain 186
  • https://cdn.m6r.eu/sync/api HTTP 302
  • https://tracking.m6r.eu/sync/api?checkcookies=true
Request Chain 189
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=c012fc72aaabea188ef69a127cd06815&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dc012fc72aaabea188ef69a127cd06815%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=c012fc72aaabea188ef69a127cd06815&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dc012fc72aaabea188ef69a127cd06815%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=454941552848532931 HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c012fc72aaabea188ef69a127cd06815&userId=adscale-user:454941552848532931
Request Chain 190
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=c012fc72aaabea188ef69a127cd06815
Request Chain 191
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=wBL8cqqr6hiO9poSfNBoFQ HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=wBL8cqqr6hiO9poSfNBoFQ&google_tc= HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 192
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=c012fc72aaabea188ef69a127cd06815
Request Chain 203
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa0BDJ8EiasBs_CEif-BiUABifkBSfsWsfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1001320161948530272&axd_pid=22&axd_fuid=BSa0BDJ8EiasBs_CEif-BiUABifkBSfsWsfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 302
  • https://uss.xplosion.de/usersync?sid=65966&fpid=1001320161948530272

199 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • https://golem.de/
  • https://www.golem.de/
184 KB
40 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f817234ee0568bd6b081361621202326ae21b9c5b7d03f62f4b05ee533339e03
Security Headers
Name Value
Strict-Transport-Security max-age=11001100; includeSubDomains; preload

Request headers

Host
www.golem.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Server
nginx
Date
Sun, 17 Mar 2019 18:48:44 GMT
Content-Type
text/html; charset=UTF-8
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Set-Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; expires=Mon, 18-Mar-2019 06:48:44 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=11001100; includeSubDomains; preload
ETag
"PEAR-Cache-643c88cd76be6176c6c21c6a45f08a47"
Content-Encoding
gzip
Cache-Control
private
Vary
User-Agent, Accept-Encoding

Redirect headers

Server
nginx
Date
Sun, 17 Mar 2019 18:48:44 GMT
Content-Type
text/html
Content-Length
178
Connection
keep-alive
Keep-Alive
timeout=3
Location
https://www.golem.de/
X-UPSTREAM
hybrid2.golem.de
golem_main_128-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_128-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
bb625be9acda8602cebced8a7ee968d86b274c72e808094bcc59208f485043a3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Feb 2019 22:14:35 GMT
Server
nginx
ETag
W/"5c61f3cb-1246f"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:44 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
248 KB
60 KB
Script
General
Full URL
https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:280::5f76 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
d01cb419e4efc09c07fecfe480bdf41046b691f4df2f0f4e1dcd19bcfedafac9

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:44 GMT
content-encoding
gzip
x-amz-request-id
C1E333E4A632999E
status
200
access-control-max-age
86400
content-length
61196
x-amz-id-2
tifxAXhKLQhHhn25YGEW+Hx8mWsvV/nqZ6Ghkv6cpN4i8PlTG9xx/CBLTEwP45tjsUc6SBz5PDs=
last-modified
Fri, 15 Mar 2019 14:58:08 GMT
server
AmazonS3
etag
"7c765623e91ef40d0478854337a8f83a"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=545
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
logo-g.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/logo-g.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-e82"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Wed, 17 Apr 2019 18:48:44 GMT
140057-190410-190408_rc.jpg
www.golem.de/1903/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1903/140057-190410-190408_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
75cbe13cf1d23ab8bc8f89ad68544db241052ef13726f724fece9f4fbe20f86e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sun, 17 Mar 2019 10:27:02 GMT
Server
nginx
ETag
"5c8e20f6-56d3"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22227
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140055-190403-190398_rc.jpg
www.golem.de/1903/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1903/140055-190403-190398_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
76fc061c0fd7a0978880ed26ede6ec00ae82798408b18947187513a047f2a002

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sun, 17 Mar 2019 09:55:04 GMT
Server
nginx
ETag
"5c8e1978-131f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4895
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140056-190407-190404_rc.jpg
www.golem.de/1903/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1903/140056-190407-190404_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1dfcc6b39f2dfdf8ac3b4c246ace16162ded9b98803a5941c9f4b51435b203bb

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sun, 17 Mar 2019 10:10:03 GMT
Server
nginx
ETag
"5c8e1cfb-2524"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9508
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140054-190396-190393_rc.jpg
www.golem.de/1903/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1903/140054-190396-190393_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
613fee01cd25e853f87abcd81f331e90ccd445b69d522cd9877e9f84edcd6a51

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sat, 16 Mar 2019 18:59:03 GMT
Server
nginx
ETag
"5c8d4777-1e13"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7699
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140053-190392-190389_rc.jpg
www.golem.de/1903/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1903/140053-190392-190389_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
59411aff3890b0ae31175276ddbedae3e9610e2e2cfa04aff131470d03fafb8b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sat, 16 Mar 2019 14:39:02 GMT
Server
nginx
ETag
"5c8d0a86-266c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9836
Expires
Wed, 17 Apr 2019 18:48:45 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1552847942&f=ev&v=d&t=ad%2Fjobs2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
799
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
ah-snap.jpg
video.golem.de/teaser/1/1/22625/thumb-high-1000/
91 KB
91 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22625/thumb-high-1000/ah-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
81853f15c5bef476fe9d074c009a68fbd05fb2ee84d1ae2cccef492f2d7068a6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
Last-Modified
Sun, 17 Mar 2019 17:58:34 GMT
Server
nginx
ETag
"5c8e8aca-16b44"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
92996
Expires
Wed, 17 Apr 2019 18:48:44 GMT
boeing.jpg
video.golem.de/teaser/1/1/22621/thumb-high-1000/
99 KB
99 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22621/thumb-high-1000/boeing.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d14607e74d1b593d5c81ed82c27efe350ac4793528423e77bf44065b0111bb41

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
Last-Modified
Sat, 16 Mar 2019 07:14:54 GMT
Server
nginx
ETag
"5c8ca26e-18b6c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
101228
Expires
Wed, 17 Apr 2019 18:48:44 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1552847041&f=ev&v=d&t=ad%2Fdeals2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
798
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
139953-189930-189927_rc.jpg
www.golem.de/1903/
101 KB
101 KB
Image
General
Full URL
https://www.golem.de/1903/139953-189930-189927_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6f92b53295df3853f4f12040e7d0986ac00efa2a35f15c884ee785fd16018569

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Wed, 13 Mar 2019 11:11:03 GMT
Server
nginx
ETag
"5c88e547-19334"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
103220
Expires
Wed, 17 Apr 2019 18:48:45 GMT
golem_main_114-min.js
www.golem.de/staticrl/scripts/
100 KB
41 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-190c7"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:45 GMT
longread-swiper_128-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_128-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fa1ef5ada57aee13df27471b97964993e328305da6f3c7e5887bab16f2fd39ed

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Content-Encoding
gzip
Last-Modified
Thu, 24 Jan 2019 16:35:48 GMT
Server
nginx
ETag
W/"5c49e964-94c"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:45 GMT
account_js_dt18_1_0.php
www.golem.de/abo/
88 B
474 B
Script
General
Full URL
https://www.golem.de/abo/account_js_dt18_1_0.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sun, 17 Mar 2019 18:48:45 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Content-Type
application/javascript
Cache-Control
no-store, no-cache, must-revalidate
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 26 Jul 1997 05:00:00 GMT
sdcv.js
ads.golem.de/
63 B
430 B
Script
General
Full URL
https://ads.golem.de/sdcv.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ads.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Wed, 17 Apr 2019 18:48:44 GMT
iam.js
script.ioam.de/
31 KB
10 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 000e
Resource Hash
fd286e1b79b2e83abb640008b29b586f28c772b5719bd0701528b369ec3e963c

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Content-Encoding
gzip
Last-Modified
Sun, 17 Mar 2019 18:48:45 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 000e
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
privat, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Sun, 17 Mar 2019 20:48:45 GMT
gpt.js
www.googletagservices.com/tag/js/
32 KB
11 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81c::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
3a80b900c538dce6ded080e90ee6a3e25c9264181192f962dc62959412020681
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"110 / 767 of 1000 / last-modified: 1552592184"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10800
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:44 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
341 KB
102 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.85 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-85.fra6.r.cloudfront.net
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
215440186151c5a33ed5759fd02f70f7911c719a316747b960e7ed2ab7f760f2

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 17:40:33 GMT
content-encoding
gzip
server
nginx/1.14.0 (Ubuntu)
age
4092
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=10800, public
x-amz-cf-id
d7LftPfqvKoclMikeCMVObUuS8jBY9m3gTlMF56VzDRN7DDLfSIfdQ==
via
1.1 7ed7afde326861e358c3c83359e99895.cloudfront.net (CloudFront)
expires
Sun, 17 Mar 2019 20:40:33 GMT
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
115 KB
45 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.100.197.52 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a95-100-197-52.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
278fb7557ae83b5f02c45dce216f48da3e1f76ea6cad31aa95614604d704ba8f

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 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=77556
Connection
keep-alive
Content-Type
text/javascript
Content-Length
45374
Expires
Mon, 18 Mar 2019 16:21:21 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.45.237.209 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-45-237-209.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.golem.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/
828 B
1 KB
Script
General
Full URL
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.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
875664108fc0fcfe834d960dd1c9bc4ae792a77e371f253ebafecaa041095881

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:52 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Status
200 OK
Cache-Control
no-store,no-cache
Transfer-Encoding
chunked
Connection
close
Content-Type
text/javascript
Keep-Alive
timeout=3, max=500
Expires
Wed, 18 Feb 2009 11:53:30 GMT
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-57f4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22516
Expires
Wed, 17 Apr 2019 18:48:44 GMT
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:44 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-5870"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22640
Expires
Wed, 17 Apr 2019 18:48:44 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
21 KB
21 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-53c8"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21448
Expires
Wed, 17 Apr 2019 18:48:45 GMT
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

Request headers

Response headers

Content-Type
image/svg+xml
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
20 KB
20 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-5074"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20596
Expires
Wed, 17 Apr 2019 18:48:45 GMT
truncated
/
126 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff

Request headers

Response headers

Content-Type
image/svg+xml
truncated
/
147 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f

Request headers

Response headers

Content-Type
image/svg+xml
truncated
/
153 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31

Request headers

Response headers

Content-Type
image/svg+xml
truncated
/
258 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2

Request headers

Response headers

Content-Type
image/svg+xml
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
26 KB
26 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-6624"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26148
Expires
Wed, 17 Apr 2019 18:48:45 GMT
integrator.js
adservice.google.de/adsid/
109 B
172 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:809::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/
109 B
172 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
104
x-xss-protection
1; mode=block
pubads_impl_319.js
securepubads.g.doubleclick.net/gpt/
160 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
cf65e308f1c461e06038b45d5bfa27689e22241f6b673b7d540d35cdd0ca4c32
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 07 Mar 2019 16:13:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
58724
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:45 GMT
btn-follow-sp4.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/btn-follow-sp4.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a62f5daff85d4695d52eb94efef62aea68deb1eb2baaa3c6463d6f95dadbb240

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/staticrl/styles/golem_main_128-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_128-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-fb2"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4018
Expires
Wed, 17 Apr 2019 18:48:45 GMT
dmp
tracking.m6r.eu/sync/
119 B
614 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.45.237.209 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-45-237-209.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
5afa0b7c384d82c48babd89be5f8afd9e250302162dfa427f9680e091b0d51d1

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:45 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.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
122
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
83 KB
31 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:808::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
76c89f30a537c7330350de97c8eb97554f54a1155b212cc7fcb5b732b9c83e8e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:45 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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
31822
x-xss-protection
1; mode=block
server
cafe
etag
2229521097763506342
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sun, 17 Mar 2019 18:48:45 GMT
golem_csi-121-min.js
www.golem.de/staticrl/scripts/adsense/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/adsense/golem_csi-121-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-7ff"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:45 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1218740&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.3.0&x_source.tid=129432dc-7ae5-40e2-b5ec-689e75d7c909&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.08272555185848929
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_GCM
Server
213.19.162.31 , United Kingdom, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
e80f35da44eb3fdedeb6b3473fd53a2704bb690d624e9375fb0db6962f5e35a5

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:45 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=0, max=10
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
arj
yieldlove-d.openx.net/w/1.0/
8 KB
2 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=0&tws=1600x1200&be=1&bc=hb_pb_2.1.6&dddid=69551e63-b7c1-46d4-aa08-59408b5e6a3e%2C129432dc-7ae5-40e2-b5ec-689e75d7c909%2C0043ec97-736f-4f47-85d8-6194874b1d58%2Ca3dd340c-3e97-4795-867d-b1ca998af130&nocache=1552848525352&x_gdpr_f=1&aus=300x250%7C300x600%2C160x600%2C120x600%2C200x600%7C300x600%2C300x250%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbanner&auid=540523394%2C540523392%2C540523393%2C540523387&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
173.241.240.220 New York, United States, ASN36089 (OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
Reverse DNS
ox-173-241-240-220.xa.dc.openx.org
Software
OXGW/16.121.0 /
Resource Hash
86f7eae1f6f765dadc959968a1b5e152269ea620a39eba743fd8691762e2c484

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Sun, 17 Mar 2019 18:48:45 GMT
content-encoding
gzip
server
OXGW/16.121.0
status
200
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.golem.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
expires
Mon, 26 Jul 1997 05:00:00 GMT
dsh
hb.adscale.de/
0
0

ads
securepubads.g.doubleclick.net/gampad/
176 KB
49 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3848651052319111&correlator=717020829832513&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&json_a=1&eid=21062415%2C21063065%2C21063307&vrg=319&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=770x251%7C800x251%7C970x251%7C20x10%7C30x10%7C40x10%7C80x10%7C100x10%2C800x450%7C580x500%7C580x360&prev_scp=adslot%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%26pc%3D1%7Cadslot%3Dposterad%26af%3Dptad%2Cintxspt%26pc%3D1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26adset%3Dbrsl%26flash%3Dno%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-noanswer&cookie_enabled=1&bc=15&lmt=1552848525&dt=1552848525373&dlt=1552848524715&idt=577&frm=20&biw=1585&bih=1200&oid=3&adxs=0%2C0&adys=0%2C0&adks=3798284268%2C1288130579&ucis=1%7C2&ifi=1&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=33&icsg=60828223&std=0&csl=340&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0%7C1000x0&msz=770x251%7C800x450&blev=1&bisch=1&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&fws=128%2C128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
52aabdebe098d6e0d138c2661fda802dd50f5890da0d150967908838c9e20b24
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 17 Mar 2019 18:48:45 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
50253
x-xss-protection
1; mode=block
google-lineitem-id
-1,-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-1,-2
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_319.js
securepubads.g.doubleclick.net/gpt/
67 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
c11b9a046106f278a5fb5411e95c1ba5d6f06daf9e4bfa98da51c523e4157388
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 07 Mar 2019 16:13:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
25393
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:45 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

gx-ads.js
ads.golem.de/track.ads/
226 B
594 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=5359651765232798&adsize=300x250&adunit=11
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ads.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Mon, 04 Feb 2019 16:34:53 GMT
Server
nginx
ETag
"5c5869ad-e2"
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
226
Expires
Wed, 17 Apr 2019 18:48:45 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190313/r20190131/
198 KB
74 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190313/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.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:808::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d6305c6ca4187969344afb4397344a451f65786537f4f54302c59f38c07f0a9d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:45 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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
75582
x-xss-protection
1; mode=block
server
cafe
etag
12822828111139054337
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sun, 17 Mar 2019 18:48:45 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190313/r20190131/ Frame DAA8
198 KB
74 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190313/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.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:808::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d6305c6ca4187969344afb4397344a451f65786537f4f54302c59f38c07f0a9d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:45 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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
75582
x-xss-protection
1; mode=block
server
cafe
etag
12822828111139054337
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sun, 17 Mar 2019 18:48:45 GMT
ca-pub-2342548244565729.js
pagead2.googlesyndication.com/pub-config/r20160913/
133 B
245 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-2342548244565729.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:808::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 16:10:57 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Sat, 16 Mar 2019 01:02:58 GMT
server
sffe
age
9468
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=43200
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
125
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 04:10:57 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190313/r20190131/ Frame 3FBA
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190313/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81a::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20190313/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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

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
Wed, 13 Mar 2019 13:30:43 GMT
expires
Wed, 27 Mar 2019 13:30:43 GMT
content-type
text/html; charset=UTF-8
etag
1255180509436287879
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6616
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
364682
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
ads
googleads.g.doubleclick.net/pagead/ Frame 4C65
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525448&bpp=15&bdt=733&fdt=60&idt=59&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&correlator=8447921753257&rume=1&frm=20&pv=2&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=46842679232&dssz=40&mdo=0&mso=0&u_tz=0&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=453&ady=3984&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=636311223&ifi=4&uci=4.p7dm2z7uwl7p&fsb=1&xpc=YywuB2JAFw&p=https%3A//www.golem.de&dtd=75
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190313/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81a::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525448&bpp=15&bdt=733&fdt=60&idt=59&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&correlator=8447921753257&rume=1&frm=20&pv=2&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=46842679232&dssz=40&mdo=0&mso=0&u_tz=0&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=453&ady=3984&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=636311223&ifi=4&uci=4.p7dm2z7uwl7p&fsb=1&xpc=YywuB2JAFw&p=https%3A//www.golem.de&dtd=75
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

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
Sun, 17 Mar 2019 18:48:45 GMT
server
cafe
content-length
18595
x-xss-protection
1; mode=block
set-cookie
test_cookie=CheckForPermission; expires=Sun, 17-Mar-2019 19:03:45 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
expires
Sun, 17 Mar 2019 18:48:45 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
75 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190313/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81c::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
ea8709c333523eaa79e47d2670f5bbb49c469bf52de4d4c5d4b83571ec14da65
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
27825
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:45 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 48A0
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525463&bpp=8&bdt=748&fdt=82&idt=44&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=8447921753257&rume=1&frm=20&pv=1&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=184281632704&dssz=41&mdo=0&mso=0&u_tz=0&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=453&ady=4660&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=1823298079&ifi=5&uci=5.ijqkwpjo4syv&fsb=1&xpc=vHuqpht3WS&p=https%3A//www.golem.de&dtd=84
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190313/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81a::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525463&bpp=8&bdt=748&fdt=82&idt=44&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=8447921753257&rume=1&frm=20&pv=1&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=184281632704&dssz=41&mdo=0&mso=0&u_tz=0&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=453&ady=4660&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=1823298079&ifi=5&uci=5.ijqkwpjo4syv&fsb=1&xpc=vHuqpht3WS&p=https%3A//www.golem.de&dtd=84
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

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
Sun, 17 Mar 2019 18:48:45 GMT
server
cafe
content-length
18482
x-xss-protection
1; mode=block
set-cookie
test_cookie=CheckForPermission; expires=Sun, 17-Mar-2019 19:03:45 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
expires
Sun, 17 Mar 2019 18:48:45 GMT
cache-control
private
ads
googleads.g.doubleclick.net/pagead/ Frame 5605
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525471&bpp=9&bdt=756&fdt=82&idt=36&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=8447921753257&rume=1&frm=20&pv=1&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=184281632704&dssz=41&mdo=0&mso=0&u_tz=0&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=453&ady=5349&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=154924829&ifi=6&uci=6.we7v6ftu2jxi&fsb=1&xpc=SmHiIL0RzA&p=https%3A//www.golem.de&dtd=85
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190313/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81a::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1552848525&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1552848525471&bpp=9&bdt=756&fdt=82&idt=36&shv=r20190313&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=8447921753257&rume=1&frm=20&pv=1&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&ga_fc=0&iag=0&icsg=184281632704&dssz=41&mdo=0&mso=0&u_tz=0&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=453&ady=5349&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060549%2C21060853%2C21063244%2C20040011&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=154924829&ifi=6&uci=6.we7v6ftu2jxi&fsb=1&xpc=SmHiIL0RzA&p=https%3A//www.golem.de&dtd=85
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

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
Sun, 17 Mar 2019 18:48:45 GMT
server
cafe
content-length
18860
x-xss-protection
1; mode=block
set-cookie
test_cookie=CheckForPermission; expires=Sun, 17-Mar-2019 19:03:45 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
expires
Sun, 17 Mar 2019 18:48:45 GMT
cache-control
private
submit
lb29.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb29.s400.meetrics.net/bb-mx/submit?/Lc6ABJAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FoywAx5AtwAztAxxAtxAw6Aw4At2A35A2wAwtAyuAxwA2uAytAxkExlE4mEwkEL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSR9CPAAAAAAAAAOAAAAGBAAAAAAZwSR9CBRksFAQtjFlUerSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:45 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Sun, 17 Mar 2019 18:48:44 GMT
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6ACJAAATkzFARksFAQtjFEoJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:45 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:44 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2Fn.a.&cb=000e&i2=000ed36d44830c5035c8e968d&ep=1579469800&vr=412&id=s9k4qs&...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2Fn.a.&cb=000e&i2=000ed36d44830c5035c8e968d&ep=1579469800&vr=412&id=s9k4qs&...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2Fn.a.&cb=000e&i2=000ed36d44830c5035c8e968d&ep=1579469800&vr=412&id=s9k4qs&i3=000ed36d44830c5035c8e968d%3A1579286925619%3A1552848525619%3A.golem.de%3A1%3A1552848525619%21hukl54&n1=1&dntt=0&lt=1552848525620&ev=&cs=qa7bq6&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 002f
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 002f
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 002f
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
Sun, 17 Mar 2019 18:48:45 GMT
Server
nginx
Location
/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2Fn.a.&cb=000e&i2=000ed36d44830c5035c8e968d&ep=1579469800&vr=412&id=s9k4qs&i3=000ed36d44830c5035c8e968d%3A1579286925619%3A1552848525619%3A.golem.de%3A1%3A1552848525619%21hukl54&n1=1&dntt=0&lt=1552848525620&ev=&cs=qa7bq6&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sat, 17 Mar 2018 18:48:45 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
72 KB
27 KB
Script
General
Full URL
https://cdn.onthe.io/io.js/IjvnOpbzskTW
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.197.186.29 New York, United States, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
cdn-eu-15.fra1.do.onthe.io
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Content-Encoding
gzip
Last-Modified
Mon, 04 Mar 2019 12:32:02 GMT
Server
nginx/1.14.0 (Ubuntu)
ETag
W/"5c7d1ac2-11e36"
Transfer-Encoding
chunked
X-Hostname
cdn-eu-15
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Mon, 18 Mar 2019 12:33:49 GMT
ga.js
www.google-analytics.com/
45 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/ga.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:816::200e , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 16 Jan 2019 20:01:45 GMT
server
Golfe2
age
5023
date
Sun, 17 Mar 2019 17:25:02 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
17168
expires
Sun, 17 Mar 2019 19:25:02 GMT
swiper-4.2.2.custom.min.js
www.golem.de/staticrl/scripts/external/
69 KB
23 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/external/swiper-4.2.2.custom.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-113e8"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:45 GMT
golem_cpxl_113-min.js
www.golem.de/staticrl/scripts/
8 KB
4 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_cpxl_113-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-1e61"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:45 GMT
testturm-snap.jpg
video.golem.de/teaser/1/1/22618/thumb-high-1000/
123 KB
123 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22618/thumb-high-1000/testturm-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0c6e638ad05d9f7a4209ab71f1da73c8324cfff78e4697a0a0ef360f192c0919

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Fri, 15 Mar 2019 10:16:58 GMT
Server
nginx
ETag
"5c8b7b9a-1eaf0"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
125680
Expires
Wed, 17 Apr 2019 18:48:45 GMT
modely-snap.jpg
video.golem.de/teaser/1/1/22617/thumb-high-1000/
56 KB
57 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22617/thumb-high-1000/modely-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
79585ce2613d27fccf5228affdce09e12346155d22c276aa18330b78144ac276

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Fri, 15 Mar 2019 07:04:23 GMT
Server
nginx
ETag
"5c8b4e77-e0f4"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
57588
Expires
Wed, 17 Apr 2019 18:48:45 GMT
avengers-endgame-trailer-(maerz-2019-dt.).jpg
video.golem.de/teaser/1/1/22616/thumb-high-1000/
55 KB
55 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22616/thumb-high-1000/avengers-endgame-trailer-(maerz-2019-dt.).jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9338f1a6f40d5623b62485ecb9fc3b2b6d3728652b72e7eddf4bd819ecd67d7d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Thu, 14 Mar 2019 15:32:08 GMT
Server
nginx
ETag
"5c8a73f8-db77"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
56183
Expires
Wed, 17 Apr 2019 18:48:45 GMT
doom-annihilation-kinotrailer.jpg
video.golem.de/teaser/1/1/22603/thumb-high-1000/
66 KB
67 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22603/thumb-high-1000/doom-annihilation-kinotrailer.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
04010089507165fd1954135b4dff919c5d3e951008c7c079600fae990820501c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Wed, 13 Mar 2019 08:14:21 GMT
Server
nginx
ETag
"5c88bbdd-109a2"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68002
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140025-190298-190294_rc.jpg
www.golem.de/1903/
4 KB
5 KB
Image
General
Full URL
https://www.golem.de/1903/140025-190298-190294_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fe3318d2d645af0efbaafba323874818d582160c0355b08cd8749190fdebb5d4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Fri, 15 Mar 2019 11:09:03 GMT
Server
nginx
ETag
"5c8b87cf-1125"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4389
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140052-190388-190385_rc.jpg
www.golem.de/1903/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1903/140052-190388-190385_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3aecb525fc55187cf441ff3e7c94cb3f463bcbaec0a16e12f762d4285efcc855

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sat, 16 Mar 2019 14:15:04 GMT
Server
nginx
ETag
"5c8d04e8-1e30"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7728
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140013-190372-190371_rc.jpg
www.golem.de/1903/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1903/140013-190372-190371_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
27c3d151e13b4b9c9f151554f94d470e57a0857c0f509dd22dc4517de5024f84

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sat, 16 Mar 2019 08:02:02 GMT
Server
nginx
ETag
"5c8cad7a-1e80"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7808
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140051-190384-190381_rc.jpg
www.golem.de/1903/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1903/140051-190384-190381_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
971b2a08a5960a24b737eafc0d90ad6028d0474a880d315215afe64eb8480076

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sat, 16 Mar 2019 13:08:03 GMT
Server
nginx
ETag
"5c8cf533-1c7d"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7293
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140042-190344-190341_rc.jpg
www.golem.de/1903/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1903/140042-190344-190341_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5119213ddf0a4c5f116618c4d0663fbf21721d60917432979406652404ff21d4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Fri, 15 Mar 2019 15:23:03 GMT
Server
nginx
ETag
"5c8bc357-1701"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5889
Expires
Wed, 17 Apr 2019 18:48:45 GMT
139927-190036-190033_rc.jpg
www.golem.de/1903/
163 KB
164 KB
Image
General
Full URL
https://www.golem.de/1903/139927-190036-190033_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
386bc3ef6a539db164639c8f33b2c47694dca03548023d2e5dea731969b20e0e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Thu, 14 Mar 2019 13:00:03 GMT
Server
nginx
ETag
"5c8a5053-28d49"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
167241
Expires
Wed, 17 Apr 2019 18:48:45 GMT
139995-190197-190192_rc.jpg
www.golem.de/1903/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1903/139995-190197-190192_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3f08f61b37ba18badabe6a8df29a9945f4670bc7e2b7de267ae841bcf70f6fe4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Thu, 14 Mar 2019 11:01:04 GMT
Server
nginx
ETag
"5c8a3470-1da8"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7592
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140050-190380-190377_rc.jpg
www.golem.de/1903/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1903/140050-190380-190377_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6190c992cdddb49e273ae8d06e497e43580f81f0258dcfbe6cda2be987a14fa1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sat, 16 Mar 2019 11:57:03 GMT
Server
nginx
ETag
"5c8ce48f-1631"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5681
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140039-190306-190303_rc.jpg
www.golem.de/1903/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1903/140039-190306-190303_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ac024d7beb9ce29c7d360467421a8535c926305f0b8058e59486199b733883c3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Fri, 15 Mar 2019 11:41:02 GMT
Server
nginx
ETag
"5c8b8f4e-16ac"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5804
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140049-190376-190373_rc.jpg
www.golem.de/1903/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1903/140049-190376-190373_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
38b7eea19be05ef8257f7c8f9576cbe1648a6ba6fe969383b9fdbbd423e660c1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Sat, 16 Mar 2019 09:07:03 GMT
Server
nginx
ETag
"5c8cbcb7-14ce"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5326
Expires
Wed, 17 Apr 2019 18:48:45 GMT
139987-190081-190077_rc.jpg
www.golem.de/1903/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1903/139987-190081-190077_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5301775b295f2c96aef07a45eebcd0e9073415f19abe57d044ac7b240804dcf2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Wed, 13 Mar 2019 13:57:03 GMT
Server
nginx
ETag
"5c890c2f-151c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5404
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140047-190365-190364_rc.jpg
www.golem.de/1903/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1903/140047-190365-190364_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1af61cbe886774756dfa4b5a58bf86c1291ad0360129fd73ecc51cdbf13a0b1f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Fri, 15 Mar 2019 17:36:02 GMT
Server
nginx
ETag
"5c8be282-1500"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5376
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140028-190249-190246_rc.jpg
www.golem.de/1903/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1903/140028-190249-190246_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
39a6457aba5c0929a98f7a4646f9b1a4b6ef2d00eb89839a5413a84aa0a2535c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Last-Modified
Fri, 15 Mar 2019 04:16:03 GMT
Server
nginx
ETag
"5c8b2703-17f4"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6132
Expires
Wed, 17 Apr 2019 18:48:45 GMT
140048-190360-190357_rc.jpg
www.golem.de/1903/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1903/140048-190360-190357_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e4905f6f551766efb54734d3be6981eb47073c6921ed9a3374aa579f6717eabc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 17:00:03 GMT
Server
nginx
ETag
"5c8bda13-27fd"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10237
Expires
Wed, 17 Apr 2019 18:48:46 GMT
139973-190092-190089_rc.jpg
www.golem.de/1903/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1903/139973-190092-190089_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d18638555319c36f905dfec62892cea2b8e7d8e6265ee5d3d8bfd487ae6214b6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Thu, 14 Mar 2019 08:03:03 GMT
Server
nginx
ETag
"5c8a0ab7-2448"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9288
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140046-190356-190352_rc.jpg
www.golem.de/1903/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1903/140046-190356-190352_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25906438e762044e853f3019611572df70ac8e33b42eb3268cbbb297bf8006c4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 16:50:02 GMT
Server
nginx
ETag
"5c8bd7ba-235c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9052
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140022-190280-190277_rc.jpg
www.golem.de/1903/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1903/140022-190280-190277_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
dc7ae7eadcf312b9c3a0c4cdd7ee55c8e3ac1628b49cb91eab5311827b79f2c1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 09:38:04 GMT
Server
nginx
ETag
"5c8b727c-26dd"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9949
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140045-190351-190348_rc.jpg
www.golem.de/1903/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1903/140045-190351-190348_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a1e2793e666d4551fe411ffa48f31946df6112565504a27e4b6465db35bb3bea

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 16:30:03 GMT
Server
nginx
ETag
"5c8bd30b-1f31"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7985
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140043-190340-190339_rc.jpg
www.golem.de/1903/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1903/140043-190340-190339_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
224a01642a00ad414adaa06251239d87ace9c850127bdd2fc4094034e51b60c5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 16:10:03 GMT
Server
nginx
ETag
"5c8bce5b-2415"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9237
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140044-190338-190335_rc.jpg
www.golem.de/1903/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1903/140044-190338-190335_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a7bef17b2ce10ee929c74c24fac274c8e052589881e230ffedfefac359f16951

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 15:45:03 GMT
Server
nginx
ETag
"5c8bc87f-1f05"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7941
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140041-190327-190324_rc.jpg
www.golem.de/1903/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1903/140041-190327-190324_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
454bcb9f2f2874cedb26b750abfad47ac675b6d77eba5d3ccea4400fc23858aa

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 14:35:03 GMT
Server
nginx
ETag
"5c8bb817-25be"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9662
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140040-190310-190307_rc.jpg
www.golem.de/1903/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1903/140040-190310-190307_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4752c7a7898c850c1e5fe3da80447f5ebce463f8da44d5b9bcfd22d4dc6f1457

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 12:05:04 GMT
Server
nginx
ETag
"5c8b94f0-19f6"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6646
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140038-190302-190299_rc.jpg
www.golem.de/1903/
4 KB
5 KB
Image
General
Full URL
https://www.golem.de/1903/140038-190302-190299_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
13850b41e27eef84f40517a3ed1d9c76132d4015f94bafbd274220a399a8fe31

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 11:50:04 GMT
Server
nginx
ETag
"5c8b916c-11ac"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4524
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140037-190293-190290_rc.jpg
www.golem.de/1903/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1903/140037-190293-190290_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a0ab5f484ba7935f1ec9a1fd3fa7b1d4fb8177c6ced35cefc442ae36425dd05b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 10:47:02 GMT
Server
nginx
ETag
"5c8b82a6-1e02"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7682
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140036-190289-190286_rc.jpg
www.golem.de/1903/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1903/140036-190289-190286_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2fbc3744b62ce3dc6bbfc3d4d7fab37e78f20aa24559f49f31ea8066f86c1e03

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 10:32:03 GMT
Server
nginx
ETag
"5c8b7f23-123a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4666
Expires
Wed, 17 Apr 2019 18:48:46 GMT
137810-179607-179599_rc.jpg
www.golem.de/1811/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1811/137810-179607-179599_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ebcd221d528108f8908d8f49bd1b9c67a0660c22e89eed3fcf143dceb37f30d5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 20 Nov 2018 10:15:04 GMT
Server
nginx
ETag
"5bf3dea8-1b12"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6930
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140035-190283-190282_rc.jpg
www.golem.de/1903/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1903/140035-190283-190282_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e91846fe88a7f9a2302909fa9ecba900c243c536fbd239bf479b2b21839371f7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 10:02:03 GMT
Server
nginx
ETag
"5c8b781b-227d"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8829
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140034-190276-190273_rc.jpg
www.golem.de/1903/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1903/140034-190276-190273_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ab1879106759e586360973f1d090a0cf78387bfa7589411255ffe5be406ce9fd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 09:49:02 GMT
Server
nginx
ETag
"5c8b750e-1a3c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6716
Expires
Wed, 17 Apr 2019 18:48:46 GMT
140032-190272-190271_rc.jpg
www.golem.de/1903/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1903/140032-190272-190271_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9ea7e4ae860137df77a0ab24a3c105a2d6e9ab25a9b7cb84f64c191c9c17eb5d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 15 Mar 2019 09:35:03 GMT
Server
nginx
ETag
"5c8b71c7-27b4"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10164
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139680-188660-188658_rc.jpg
www.golem.de/1903/
11 KB
12 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139680-188660-188658_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2d555c86f0e8276cef6143ffdcf22ed5612e2a83aad243b43dc79e2a5d2e39d3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 12 Mar 2019 11:00:04 GMT
Server
nginx
ETag
"5c879134-2da8"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11688
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139719-189721-189719_rc.jpg
www.golem.de/1903/
35 KB
35 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139719-189721-189719_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fc150075dfee7b25744936f241348d41bc153b8d599c2c40be293527d22789cb

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Mon, 11 Mar 2019 11:02:04 GMT
Server
nginx
ETag
"5c86402c-8b36"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
35638
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139857-189489-189487_rc.jpg
www.golem.de/1903/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139857-189489-189487_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fcc99ba4f114817ed22a449799e383fb052df033f635c1c45c546b2d5f4eb6e2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Mon, 11 Mar 2019 08:07:04 GMT
Server
nginx
ETag
"5c861728-44cd"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17613
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139780-189834-189832_rc.jpg
www.golem.de/1903/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139780-189834-189832_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
528f6796d8a079fe81dab570402ebe838c34d375c8d3ab0d1dea34416229a5cf

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 12 Mar 2019 08:29:04 GMT
Server
nginx
ETag
"5c876dd0-5b92"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23442
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139627-188380-188378_rc.jpg
www.golem.de/1902/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1902/sp_139627-188380-188378_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ca30b113c3a09c1d088db62134c3827b5663df79c6f775dcffed84ffeacc0c86

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Wed, 27 Feb 2019 08:09:03 GMT
Server
nginx
ETag
"5c76459f-576e"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22382
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139707-188755-188753_rc.jpg
www.golem.de/1903/
25 KB
25 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139707-188755-188753_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6549a32ed07cf453ac36fc4d2b517948d448104a74d4dec067b40e9d610a7cbb

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Wed, 06 Mar 2019 11:00:04 GMT
Server
nginx
ETag
"5c7fa834-6234"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
25140
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139817-189388-189385_rc.jpg
www.golem.de/1903/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139817-189388-189385_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ff8e7c05336fd8e68146ecff903727f8016ccc488b50faa13ccc75699804ee36

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Thu, 07 Mar 2019 11:00:07 GMT
Server
nginx
ETag
"5c80f9b7-5262"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21090
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139912-189748-189746_rc.jpg
www.golem.de/1903/
29 KB
30 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139912-189748-189746_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c92d0dfae0cae4a547d77592bcbc24905a4179ecbb0977b202b4848df486d0c1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Mon, 11 Mar 2019 13:00:04 GMT
Server
nginx
ETag
"5c865bd4-7541"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
30017
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139735-188914-188912_rc.jpg
www.golem.de/1903/
27 KB
27 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139735-188914-188912_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
cd6b2305a62d97e63e7f587e6a14bc2917c318706aa86f342171b001ab8912c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Fri, 08 Mar 2019 11:01:03 GMT
Server
nginx
ETag
"5c824b6f-6a90"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
27280
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139654-188905-188903_rc.jpg
www.golem.de/1903/
16 KB
17 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139654-188905-188903_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
49113cf8e2d1c8fc14e2b30d7e94b3c07726d74897d366929a4d873a4b8f763c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Wed, 06 Mar 2019 08:04:04 GMT
Server
nginx
ETag
"5c7f7ef4-412d"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16685
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139696-188752-188750_rc.jpg
www.golem.de/1903/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139696-188752-188750_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
66caa05cdc0aa916bc05695a31f9ae2d0c93de89914697b24287fba06058676e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Mon, 04 Mar 2019 11:02:04 GMT
Server
nginx
ETag
"5c7d05ac-5831"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22577
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139774-189057-189055_rc.jpg
www.golem.de/1903/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139774-189057-189055_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d1990310b85fe70c2956480b8a9e2655a74867758174759a55cd4aa62240da90

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 05 Mar 2019 11:02:04 GMT
Server
nginx
ETag
"5c7e572c-52bc"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21180
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139832-189360-189358_rc.jpg
www.golem.de/1903/
11 KB
11 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139832-189360-189358_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
24285f847959d70e18bef325a0d8517015b733e769c205bf8685f772c199cd90

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Thu, 07 Mar 2019 07:58:03 GMT
Server
nginx
ETag
"5c80cf0b-2bfa"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11258
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139795-189159-189157_rc.jpg
www.golem.de/1903/
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139795-189159-189157_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7cf1e8250ca23c04fbd7fd6d2817db0a2bd268e467fbbda458cf1fbdf17fb491

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 05 Mar 2019 13:00:06 GMT
Server
nginx
ETag
"5c7e72d6-5306"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21254
Expires
Wed, 17 Apr 2019 18:48:46 GMT
sp_139773-189078-189076_rc.jpg
www.golem.de/1903/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1903/sp_139773-189078-189076_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c6245b45ab43ac6bcda0ee9129c3be212874412ed93d583682e6ab8f36d49fa1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Mon, 04 Mar 2019 15:18:03 GMT
Server
nginx
ETag
"5c7d41ab-5bfb"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23547
Expires
Wed, 17 Apr 2019 18:48:46 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1552848526&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.149 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpx.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Sun, 17 Mar 2019 18:48:46 GMT
Server
Apache
P3P
CP="NOI NID ADMa OUR IND UNI COM NAV"
Cache-Control
no-store, no-cache, must-revalidate post-check=0, pre-check=0
Connection
close
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 GMT
sp_YVNbm-515890_rc.jpg
www.golem.de/6433/
68 B
486 B
Image
General
Full URL
https://www.golem.de/6433/sp_YVNbm-515890_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:46 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=453676987&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=759614550.1552848525&jid=733786880&_v=5.7.2&z=453676987
35 B
103 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=759614550.1552848525&jid=733786880&_v=5.7.2&z=453676987
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c08::9d , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
date
Sun, 17 Mar 2019 18:48:46 GMT
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Sun, 17 Mar 2019 18:48:45 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=759614550.1552848525&jid=733786880&_v=5.7.2&z=453676987
content-type
text/html; charset=UTF-8
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
366
expires
Fri, 01 Jan 1990 00:00:00 GMT
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
244
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
797
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
252
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
799
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
252
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
798
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
250
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
797
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
250
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
796
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
rmpslider-rl_128-min.js
www.golem.de/staticrl/scripts/radiant/
16 KB
7 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmpslider-rl_128-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
34f0850833ea2339f61d17475c7d5d228be8f1f56fd3f836ccb72f30fb9c75d4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000ed36d44830c5035c8e968d:1579286925619:1552848525619:.golem.de:1:1552848525619!hukl54; __utmc=21769261; __utmz=21769261.1552848526.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.759614550.1552848525.1552848525.1552848525.1; __utmb=21769261.1.10.1552848526; golem_us=1d7fdf70; golem_uv=1d7fdf70; golem_uz=1d7fdf70
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:45 GMT
Content-Encoding
gzip
Last-Modified
Thu, 24 Jan 2019 16:39:03 GMT
Server
nginx
ETag
W/"5c49ea27-3e1b"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:45 GMT
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
1 KB
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-mit-werbung3.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/staticrl/styles/golem_main_128-min.css
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_128-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-44b"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
1099
Expires
Wed, 17 Apr 2019 18:48:46 GMT
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
924 B
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-ohne-werbung3.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/staticrl/styles/golem_main_128-min.css
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_128-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-39c"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
924
Expires
Wed, 17 Apr 2019 18:48:46 GMT
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.230.93 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:47 GMT
Last-Modified
Sun, 17 Mar 2019 18:34:04 GMT
Server
AmazonS3
x-amz-request-id
645C742232CB9EEC
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
Sg1bmK1CFZtr6eTaNmEhFztwvEWrUKYjH0kZWPFRiNk5/1E12HuFC0Y7+kF4CkRRTFYREAg7fg0=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
291 B
682 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
rmp.min.js
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
378 KB
110 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-5e9f0"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:46 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/ Frame C667
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-32/html/container.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3971
date
Sat, 09 Mar 2019 04:02:21 GMT
expires
Sun, 08 Mar 2020 04:02:21 GMT
last-modified
Wed, 06 Feb 2019 20:59:52 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
744385
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
333 B
1000 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.115 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-115.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:24 GMT
Via
1.1 9810d82af8847b51b9c3048141069a65.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
23
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
333
Last-Modified
Wed, 16 Jan 2019 08:53:40 GMT
Server
AmazonS3
ETag
"36e7925e19d21a2047551ef140961e54"
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
zLarNrYIBpx494qWddSYli1YV-iWhCWnRlDSRfOMQEp9KH0pqbfUkw==
Expires
0
hb2.php
tracking.yieldlove-ad-serving.net/
2 B
107 B
XHR
General
Full URL
https://tracking.yieldlove-ad-serving.net/hb2.php
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.28.163.57 Frankfurt, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-163-57.eu-central-1.compute.amazonaws.com
Software
nginx/1.10.3 (Ubuntu) /
Resource Hash
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

status
200
date
Sun, 17 Mar 2019 18:54:10 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
4 KB
2 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=431346
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:30::6818:6724 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
ee7d2c527361489a36f391f25fe5fb0da87a0cd4d09a976964e6fbf565102a21
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 17 Mar 2019 18:48:46 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
cf-ray
4b912499ff33638b-FRA
status
200
last-modified
Fri, 15 Mar 2019 15:43:39 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=3600
timing-allow-origin
*
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Range
expires
Sun, 17 Mar 2019 19:48:46 GMT
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
57 KB
12 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-e209"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Wed, 17 Apr 2019 18:48:46 GMT
ads
securepubads.g.doubleclick.net/gampad/
103 KB
21 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3848651052319111&correlator=717020829832513&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fifs&adsid=NT&json_a=1&eid=21062415%2C21063065%2C21063307&vrg=319&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=120x600%7C160x600%7C200x600%7C300x600%7C10x40%7C10x30%7C10x20%2C728x90%7C728x180%7C770x250%7C20x10%7C30x10%7C40x10%7C80x10%7C800x250%7C970x250%2C300x250%7C300x601%7C300x125%7C10x20%7C10x10%2C301x250%7C300x126%7C10x10&prev_scp=adslot%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Csky%2Chpad%2Cband%26rfree%3D200-299%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%7Cadslot%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cbb%2Cvidwa%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%7Cadslot%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%7Cadslot%3Drectangle2%26af%3Df1x1%2Cmrec%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26adset%3Dbrsl%26flash%3Dno%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-idfound%26mbrid%3D7ab9b39123575de786470ffaac3f9202%26mbrseg%3Db3838f1f%252C7dd5680d%252C134dad1c%252C781245b2%252C3e05b94d&cookie=ID%3D1c6d6542cd69a6eb%3AT%3D1552848525%3AS%3DALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ&cookie_enabled=1&bc=15&lmt=1552848526&dt=1552848526397&dlt=1552848524715&idt=577&frm=20&biw=1585&bih=1200&oid=3&adxs=0%2C0%2C0%2C0&adys=0%2C0%2C0%2C0&adks=2129558987%2C973278271%2C2964933683%2C638100629&ucis=5%7C6%7C7%7C8&ifi=8&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=48&icsg=53513684651968&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x0%7C1000x0%7C300x0%7C300x2&msz=120x600%7C728x90%7C300x250%7C301x250&blev=1&bisch=1&ga_vid=759614550.1552848525&ga_sid=1552848525&ga_hid=2033765541&fws=128%2C128%2C128%2C128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
180f7c727cc51c1b3cf7a1a4fa1c8fe35a97f68c2d8884c84eef8d854e22e491
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

date
Sun, 17 Mar 2019 18:48:46 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-2,-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
21029
x-xss-protection
1; mode=block
google-lineitem-id
4947507335,4947507335,4889680744,-1
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138260028801,138260276710,138254348637,-1
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/
239 KB
82 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
0fd8d39677a15d5ecfadaa78279f66259259bfe00698bd60856c0ed0b9516249
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:46 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,44,43,39"
content-length
83498
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:46 GMT
truncated
/
68 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460

Request headers

Response headers

Content-Type
image/png
truncated
/
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627

Request headers

Response headers

Content-Type
image/png
truncated
/
715 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd

Request headers

Response headers

Content-Type
image/png
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
8 KB
9 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-20e4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8420
Expires
Wed, 17 Apr 2019 18:48:46 GMT
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:46 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-3bf0"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15344
Expires
Wed, 17 Apr 2019 18:48:46 GMT
bridge3.286.0_de.html
imasdk.googleapis.com/js/core/ Frame 74A2
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.286.0_de.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.286.0_de.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
183578
date
Wed, 13 Mar 2019 00:05:49 GMT
expires
Thu, 12 Mar 2020 00:05:49 GMT
last-modified
Wed, 13 Mar 2019 00:00:39 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, max-age=31536000
age
412977
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
client.js
s0.2mdn.net/instream/video/
26 KB
11 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:821::2006 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:46 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
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10523
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:46 GMT
sp_YVNbm-153796_rc.jpg
www.golem.de/4492/adbutler/
68 B
486 B
Image
General
Full URL
https://www.golem.de/4492/adbutler/sp_YVNbm-153796_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:46 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
sp_YVNbm-447776_rc.jpg
www.golem.de/3733/adbutler/
68 B
486 B
Image
General
Full URL
https://www.golem.de/3733/adbutler/sp_YVNbm-447776_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
__gads=ID=1c6d6542cd69a6eb:T=1552848525:S=ALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:46 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:775a1c810.6bb504738_1552848526905,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1552848526916
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/uniques/
33 B
515 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=17&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=775a1c810.6bb504738_1552848526905&1552848526946
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:48 GMT
Server
nginx
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
33
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:775a1c810.6bb504738_1552848526905,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=775a1c810.6bb504738_1552848526905&1552848526954
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:775a1c810.6bb504738_1552848526905,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1552848526959
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 99E0
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4b862283bb0b7628d0a044ee87ae769795382c60338e8690c5bd9a65261aec44
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
29080
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
Cookie set banner
ad2.adfarm1.adition.com/ Frame 4485
0
0
Document
General
Full URL
https://ad2.adfarm1.adition.com/banner?sid=3843260&kid=2997060&wpt=H&ts=493750051&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjsuQ6LVbbC-YH3eKKKjSSc7dn0vYRP8L0hXYCBFzCkfpiaT8WXjxKR3od7Ydl2MakLySuoq7al26Eqr8gSXdYKBjtw_nw2dJyhkJh8RPjSucpT0fJUy4TWqIpteiP8PcAFQD4UViNcZ6SwI64IUGoNyB6Ena2D4B7Dovy5Zm9LZB_8Nqu4heSRVGDaQD3n_LasJUjta7LVTCl-zXiSXgvOPh3QTczqKfQnQCHjYuJcWMwNHhErL5OffJZt14en5iy4j8OT34PlkuYUtJ&sai=AMfl-YRSk4Cnsk6ACGN3SY4Y0_9uSn606zv8E1jm1RmDjSkcLAquM5vrNwFezq5YD33c5vsjcURfh-ZqzTXduS67IXRzwjbvk3SwoyL0bQk5&sig=Cg0ArKJSzNKPokaFZzI8EAE&urlfix=1&adurl=
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
217.79.188.21 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
ad2.adfarm1.adition.com
Software
ADITIONSERVER v1.0 /
Resource Hash

Request headers

Host
ad2.adfarm1.adition.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Server
ADITIONSERVER v1.0
Date
Sun, 17 Mar 2019 19:48:47 +0100
Cache-Control
no-cache
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
policyref="https://imagesrv.adition.com/w3c/p3p-ssl.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Pragma
no-cache
Set-Cookie
UserID1=6669433639107624993; expires=Fri, 13-Sep-2019 19:48:46 GMT; path=/; domain=.adfarm1.adition.com lv_2997060=w=3843260|t=1552848526; expires=Sun, 17-Mar-2019 19:18:46 GMT; path=/; domain=.adfarm1.adition.com
Content-Encoding
gzip
Cookie set banner
ad2.adfarm1.adition.com/ Frame 19A7
0
0
Document
General
Full URL
https://ad2.adfarm1.adition.com/banner?sid=3843261]&kid=2997060&wpt=H&ts=493750051&clickurl=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjsuQ6LVbbC-YH3eKKKjSSc7dn0vYRP8L0hXYCBFzCkfpiaT8WXjxKR3od7Ydl2MakLySuoq7al26Eqr8gSXdYKBjtw_nw2dJyhkJh8RPjSucpT0fJUy4TWqIpteiP8PcAFQD4UViNcZ6SwI64IUGoNyB6Ena2D4B7Dovy5Zm9LZB_8Nqu4heSRVGDaQD3n_LasJUjta7LVTCl-zXiSXgvOPh3QTczqKfQnQCHjYuJcWMwNHhErL5OffJZt14en5iy4j8OT34PlkuYUtJ&sai=AMfl-YRSk4Cnsk6ACGN3SY4Y0_9uSn606zv8E1jm1RmDjSkcLAquM5vrNwFezq5YD33c5vsjcURfh-ZqzTXduS67IXRzwjbvk3SwoyL0bQk5&sig=Cg0ArKJSzNKPokaFZzI8EAE&urlfix=1&adurl=
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
217.79.188.21 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
ad2.adfarm1.adition.com
Software
ADITIONSERVER v1.0 /
Resource Hash

Request headers

Host
ad2.adfarm1.adition.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Content-Type
text/html
Transfer-Encoding
chunked
Connection
keep-alive
Server
ADITIONSERVER v1.0
Date
Sun, 17 Mar 2019 19:48:47 +0100
Cache-Control
no-cache
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
policyref="https://imagesrv.adition.com/w3c/p3p-ssl.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Pragma
no-cache
Set-Cookie
UserID1=6669433639107952673; expires=Fri, 13-Sep-2019 19:48:46 GMT; path=/; domain=.adfarm1.adition.com lv_2997060=w=3843261|t=1552848526; expires=Sun, 17-Mar-2019 19:18:46 GMT; path=/; domain=.adfarm1.adition.com
Content-Encoding
gzip
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 527F
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4b862283bb0b7628d0a044ee87ae769795382c60338e8690c5bd9a65261aec44
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
29080
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
gpt.js
www.googletagservices.com/tag/js/ Frame 0459
32 KB
11 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
3a80b900c538dce6ded080e90ee6a3e25c9264181192f962dc62959412020681
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"110 / 573 of 1000 / last-modified: 1552592184"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10800
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 0459
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4b862283bb0b7628d0a044ee87ae769795382c60338e8690c5bd9a65261aec44
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
29080
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/ Frame EEB1
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-32/html/container.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3971
date
Sat, 09 Mar 2019 04:02:21 GMT
expires
Sun, 08 Mar 2020 04:02:21 GMT
last-modified
Wed, 06 Feb 2019 20:59:52 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
744386
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
view
securepubads.g.doubleclick.net/pcs/ Frame 99E0
0
287 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuC7ItrCufDIun0qsZrTrIJURIv3oyJas4eUwVYEcJUCEb8sw9EbnnydfNmnIQnw01OmB_bqBBPYzNesaHU28YDa13gDYaxWTtb21vD77MbnutB9vPiOgRrv8nEheNK4OE52MkMrxZXNQDTmz0urpzJMj1ZiCNouY6JImaGPLLFNlPlxXyqDufAqPXJR86vV4ahOc_y2g2NXSKyEn6ga6w2CfsvID_qTvXWBqMTsO9QkDj1pw_TVL9-Ph8sLQ5N1iFaom_mDlOGxIhuG1nP5myZ5gp-wVE-q4Sf4j1Fz-4&sai=AMfl-YStw2KqDEDyzNPOvsmaXycYkqSfPwSGz_oZN6oK2jhZjMl4Auu9KhbiNnVkJlJa6T_opQIPlRaplEEO9-s4bxtZl-KQqUP6-wxGqa_B&sig=Cg0ArKJSzPgKQU1t1XQcEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 527F
0
255 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv5CgMBHa22vEa6M_T5x_qhUp3LDi7JikXoq-X47t7ThesyKgpQpZe8TG6RIzgbetJ85x2Xoprj6_285-B9JjgkYGwk1gJHwIFRoKCxWdUeGBmG14ZAmQkWXBxAJSRsUVUWE2Hp_cRcWv088lgNAxcJF4v_b9lLm-O8vXIb7gywXKi1J6Y_Gg0ku3vbk_WSXtNuclz3E4EDE5DCsBiDnvXWg1akYGEPs6tQZx2MUb-mSAjuiVWvUJfUWBwMfxOjjNq03Bm1hSN8l0WuwnTTGFBS3o2QRO63afcTSOF4J10&sai=AMfl-YT9EtyUbEspRDquaI8wbCG4xkqlV2QvmIeEZnytLM93afE1XxGtSWXOXeN-_3DRwei-HSYwcpb8RWcm4us7LrH64RGItWAIwvrd3_eK&sig=Cg0ArKJSzO0iFkuFpaXEEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 0459
0
255 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssVC5e9DAsdZMCVWMQx8Rz8Bl4gXaYS33HdV0yE8mJSfCEIlWjCJr8ZCV60wjs0SUYf-0iUbXvPPn2gjwVBRxywt654GvWgTwSpWkl4tIcQ1z47Zo1sRWRQ_WrySkrHbkERMPAorLxDMRN4zwQuq2BcLQ6V4hDKl7xM3z1kXPPbNH_zfI20wFWxVhOEsKz4aTEziKIoqfu5mPCr7hakqexkpiQkvYYQ5aFxo7Gymx8WmZ8BelVEtEjT-UiQ7U7dR1AsUFif1MIVD-yBipqb&sai=AMfl-YSNKlxp6NbQ8t_abYICwE2eBV4BZoxvzOq3nHReyuT1xMyRierhdJnJTiEb6c3Yu9wuFYrZgRH3VfHCvqLFS1ED1AoMfc-V1gR1ezNC&sig=Cg0ArKJSzN_ys2td1xS4EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/
203 KB
55 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=IfcdPydKWu
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.115 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-115.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
82e749665c7912ccff1cd83d97600274bf39815363ef0b6cc95d5fc5a9475dc1

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:28 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
20
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Wed, 13 Mar 2019 12:39:05 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-Id
obiLh7DzVxmImy8N79r4LkemlVN5m1OcsB0F7RktTFAA4jGhk-zeVA==
hb2.php
tracking.yieldlove-ad-serving.net/
2 B
107 B
XHR
General
Full URL
https://tracking.yieldlove-ad-serving.net/hb2.php
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.28.163.57 Frankfurt, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-163-57.eu-central-1.compute.amazonaws.com
Software
nginx/1.10.3 (Ubuntu) /
Resource Hash
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

status
200
date
Sun, 17 Mar 2019 18:54:11 GMT
server
nginx/1.10.3 (Ubuntu)
access-control-allow-origin
*
content-type
text/plain;charset=UTF-8
truncated
/ Frame 527F
209 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5e7a32e68bc51963a8cf9d8256490205a2d22e5dfdc5a849d26511879709535c

Request headers

Response headers

Content-Type
image/png
truncated
/ Frame 99E0
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
f6946991ed9a7582a26b10c478921ab4a95e74f789c664394615bfacb41a67cc

Request headers

Response headers

Content-Type
image/png
pubads_impl_319.js
securepubads.g.doubleclick.net/gpt/ Frame 0459
160 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
cf65e308f1c461e06038b45d5bfa27689e22241f6b673b7d540d35cdd0ca4c32
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 07 Mar 2019 16:13:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
58724
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 0459
113 B
176 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:809::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
108
x-xss-protection
1; mode=block
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6ADfZAAKktFLk2BCLkqFFlqwF23A52AwwALl1FDK2mFow3Fz0FylFhtFpuFnBFLw2FBgw4FJBFLkqFKlkyB23A52AwwA2qoFx1A1yA40A41Ay0AwxAwoEvzB5lEjxFshFoBF/k0FEEmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA23A03ALlnFBUkzF2BPzBAAZAwSAcAAAAPoQAAAAAAABvxiAPDAAFAAvxiTu5mAZBAAOA55A55A85B55A58E55A55AGAx0Ay0A03Aru5mAPFAA0EAmRAHu5mAPrFA0EARXAKu5mASksF1GjAAAAAAAAAAAAEAAAvxiAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AxBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFKAipFssFivFhyFkyBEAu1FssFEAu1FssF4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBd0EAmRAKPA7DAFAAAu5mAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAzyAvoE0tFsvBjvFu0FhpFulFyuBo0FtsFJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFC+wSVA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:46 GMT
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6AEiZAA/k0FQImvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA23A03AmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9xA04AyzAy4A05A1mAjwFpkF9kElzFr0FvwFmhEwhF90A50A31Aw3AzzA1mAjpFk9BxzA4yA2wAwyA44AwxAmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A50A31Aw3AzzA1mAhwFk9B05A03A1wA3zAz1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA3yAwwALlnFCUkzFGBPQBAAAAAAABFpAAPAAAFAAFpAThRjAZBAAOA55A55A85B55A58E55A55AEAy2Ay5ArhRjASksFbFjAAAAAAAAAAAAEAAAFpAAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAxyAw4E2wAwBEMAxzA4yA2wAwyA44AwxAGAkpFylFj0FAAAAKAx0A4yAzyA40A51AKA05A03A1wA3zAz1ADAzrF5BFKA05A03A1wA3zAz1AKA05A03A1wA3zAz1AxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdAAAAAAAAAAAAFAAAhRjAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjFGha+VA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:46 GMT
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6AFjZAA/k0FjMmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA23A03AmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9xA04AyzAy4A05A1mAjwFpkF9kElzFr0FvwFmhEwhF90A50A31Aw3AzzA1mAjpFk9BxzA4yA2wAwyA44AwxAmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A50A31Aw3AzzA1mAhwFk9B05A03A1wA3zAz1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA3yAwwAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9xA04AyzAy4A05A1mAjwFpkF9kElzFr0FvwFmhEwhF90A50A31Aw3AzzA1mAjpFk9BxzA4yA2wAy3A23AxwAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A50A31Aw3AzzA1mAhwFk9B05A03A1wA3zAz1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A1yA40A41Ay3AywAzBELlnFDTkzFtPCAAAAAAAABxiVAPAAAFAAxiVT0mcAPAAAFAAxiVTVEfASksFnEjAAAAAAAAAAAAEAAAxiVAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFGA3yA44E5wAMAxzA4yA2wAy3A23AxwAGAkpFylFj0FAAAAKAx0A4yAzyA40A51AKA05A03A1wA3zAz1AGAihFuuFlyFKA05A03A1wA3zAz1AKA05A03A1wA3zAz1A0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFQtjFp9scYA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:46 GMT
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6AGkZAATkzFrZBAAOA55A55A85B55A58E55A55AFA44Ay0AxBEr0mcASksFUOd/IAAAAYLAaBAFAAA0mcAAA8Io0F0wFz6BvvAhkFyuAhkFmhFytFxuAhkFp0FpvFuuBjvFtvBihFuuFlyF/zEpkF9zA40AzyA2wAmrEpkF9yA55A3wA2wAm3Ew0F9IEm0Ez9B05Az3A1wAw1AxmAjsFpjFr1FysF9oE00FwzF6vAvhEkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FvwEjzFvjEspFjrF/4EhpF9BELBFPqFz1FR2BMWFiiFDtBZIFzlELLFLqFTTFj3BkuFw2EZSFQ4BMwBoYFZDFCGF6DFrmFwpFhUF4XEYqF4LFSzBvkF3ZEksFyNEhrFM5FT1FvxF3hEsyB2FExyF4nETYFkZFLCFq0F3fFu3FykEK5ForFKoF4SEQqFT1FjwFUwBmKFV5F0UEXxFJwF0lFpQF4QEjBFGRFE0BVWFpOFjaF2TE3JF20AJVFHvFO5FC2BFuFhyBE0BC3BEvF25F1aEt5BMaFCfF4OEx1F0oElTFSWFHEFhRFEzBufFMhFzKFVqF0hF3MEWUFDsFt6EYpFTYFn2FPQFozBRUFj6FxLFmRFuRFDIFqZF1KFjXFN3FOIFoFFyMF1PEmmFKaF0xB0lEu1Bp5F0qE4PEUzB0QEsrF1ZFV0FKmBzhFp9BBNFmsFtZESTFr0BDuFzrF2BEDHFOzBTZF0ZEwfE51ETuF2wA26E24BFxBqtFxSEtEFqTFrjFMBFx1FN1B2yFO3FGlF6xF1ZEEzBzjE12EzqFjVFSmFotBaxF6UFYkF1TF23AJYFS6F3qFi2FrzBT3Fv5FMwBiRFr1BmzEpnF9DEnwBByFLKFT6FOLFQvFrhFGaF6JF4FEBFFm1EysFmpF49BxmAhkF1yFs9BJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFc1ehUA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:46 GMT
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6AHuZAAUkzF2BZAAAOA55A55A85B55A58E55A55AFA44Ay0AxBErVEfAPBAAc+gAAAj0mcAPAAAAAAAAAT0mcAPAAAc+gAAAjVEfAPAAAAAAAAATVEfAPAAAFAAxiVTc+gASksFmPdXUAAAAgCAYJAFAAAVEfAAA9Io0F0wFz6BvvAhkFyuAhkFmhFytFxuAhkFp0FpvFuuBjvFtvBihFuuFlyF/zEpkF9zA40AzyA2xAdmBrpFk9By5A53Aw2AwmA3wF09BImB0zF90A5zA31AwwA1xAmjEspFjrF1yFs9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFr/B4hFp9BBLFBPFqzF1RF2MEWiFiDFtZEIzBlLFLLFqTFTjF3kEuwB2ZFSQF4MEwoEYZFDCFG6FDrFmwFphFU4BXYFq4FLSFzvEk3BZkFsyBNhFrMF5TF1vFx3BhsFy2AFxFy4BnTFYkFZLFCqF03FfuF3yBkKF5oFrKFo4BSQFqTF1jFwUFwmEKVF50BUXFxJFw0FlpFQ4BQjFBGFREF0VEWpFOjFa2BT3FJ2B0JEVHFvOF5CF2FEuhFyEE0CE3EEv2F51BatF5MEaCFf4BOxF10BolFTSFWHFEhFREFzuEfMFhzFKVFq0Fh3BMWFUDFstB6YFpTFYnF2PFQoFzREUjF6xFLmFRuFRDFIqFZ1FKjFXNF3OFIoFFyFM1BPmFmKFa0Fx0AluF1pE50Bq4BPUFz0AQsFr1FZVF0KFmzEhpF9BENmFstBZSFTrF0DEuzFr2BBDFHOFzTEZ0BZwBf5B1TFu2Bw2A62F4FExqEtxBStFEqFTrFjMFBxF1NF12EyOF3GFl6Fx1BZEFzzAj1B2zFqjFVSFmoFtaEx6FUYFk1FT2B3JEYSF63FqiF2rFzTE3vF5MFwiERrF1mAzpFn9BDnFwBEyLFKTF6OFLQFvrFhGFa6FJ4BFBFFmB1yFsmFp4F9xAmhEk1FysF9BEJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAd/IAAAA4NAYJAFAAAc+gAOAxxA3xA3yAfxBy3Ay1AzfEAAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjFlkQUVA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:46 GMT
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6AIvZAA/k0FtQmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA23A03AmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9xA04AyzAy4A05A1mAjwFpkF9kElzFr0FvwFmhEwhF90A50A31Aw3AzzA1mAjpFk9BxzA4yA2wAwyA44AwxAmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A50A31Aw3AzzA1mAhwFk9B05A03A1wA3zAz1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA3yAwwAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9xA04AyzAy4A05A1mAjwFpkF9kElzFr0FvwFmhEwhF90A50A31Aw3AzzA1mAjpFk9BxzA4yA2wAy3A23AxwAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A50A31Aw3AzzA1mAhwFk9B05A03A1wA3zAz1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A1yA40A41Ay3AywAzmEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29BzzA3wA5zA31AmjEwpFk9BklFzrF0vFwmBhwFh9Bu1FssFmjEpkF9uE1sFsmBzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlyBmhEwjF9uE1sFsmBhwFk9Bu1FssFmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFymAhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A1yA40A41Ay3AyxA1BELlnFETkzFARksFAQtjFYeUIZA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:47 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:46 GMT
truncated
/
203 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
82e749665c7912ccff1cd83d97600274bf39815363ef0b6cc95d5fc5a9475dc1

Request headers

Response headers

Content-Type
text/javascript
ads
securepubads.g.doubleclick.net/gampad/ Frame 0459
16 KB
8 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2125013439368875&correlator=46146274096077&output=json_html&callback=googletag.impl.pubads.setPassbackAdContents&impl=s&eid=21061865%2C21062862%2C21062899%2C21063065%2C21063115%2C21063202%2C53887176%2C370204026&vrg=319&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu=%2F53015287%2Fgolem.de_d_300x600_2_dc&sz=300x600%7C300x250&click=https%3A%2F%2Fadclick.g.doubleclick.net%2Fpcs%2Fclick%3Fxai%3DAKAOjssDXkBFMZrsaWajXfsizZCPOb3_HnFp45QlOtkDg7VhGS-TZhWSwCMy6cBXZTcqLGuwtkni7dO-J5pgrSxzoq492Qk4pqKIwfKv92wQ2ltIhzfwpMVrGPNMLY-ox4aa6ORC1WhmciPHOaQdDazm4cUVcmr8UNE6s3ariaMRMd41etFIVYchvBZbvu5DLgDgil1fJi6h7Dsvva7oMqOQZS74eLeUAG8ZBjWF9tIc1LrP19SuLP6G7Pjl79fl1o-zPDtND08LbcWl5cj1%26sai%3DAMfl-YSBAqF8PSmmwK_hTSfLAbWK2FEMkU0OrXJkN0XEz4xRf2k8dTIK0znSNJQ-oAqgyZPLA2HnskaNwzXO7_gbSsJmqiqLVnSknWpK_5Ss%26sig%3DCg0ArKJSzP-TNe0UZPOVEAE%26urlfix%3D1%26adurl%3D&eri=2&cookie=ID%3D1c6d6542cd69a6eb%3AT%3D1552848525%3AS%3DALNI_MYslGEulUfRy2pREZDhnWlpmFfVkQ&cdm=www.golem.de&bc=15&lmt=1552848527&dt=1552848527448&dlt=1552848527063&idt=374&frm=23&biw=1585&bih=1200&isw=300&ish=601&oid=2&adk=79542337&uci=94c842dsr7ij&ifi=1&ifk=3377887499&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=https%3A%2F%2Fwww.golem.de%2F&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&blev=1&bisch=1&ga_vid=531574198.1552848527&ga_sid=1552848527&ga_hid=1335570214&fws=2
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
c192ccba6e2b0c7154d5bbccec1270b0aea42ff58b9b5b95585592e245dc5e70
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
br
x-content-type-options
nosniff
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
7803
x-xss-protection
1; mode=block
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
content-type
text/javascript; charset=UTF-8
cache-control
no-cache, must-revalidate
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_319.js
securepubads.g.doubleclick.net/gpt/ Frame 0459
67 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
c11b9a046106f278a5fb5411e95c1ba5d6f06daf9e4bfa98da51c523e4157388
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 07 Mar 2019 16:13:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
25393
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/ Frame 0459
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=9303348945
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.101.173 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:49 GMT
Last-Modified
Sun, 17 Mar 2019 18:34:04 GMT
Server
AmazonS3
x-amz-request-id
064DDADD3274C5FE
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
mKdWyh3EA87FJeZRe5hDDI/TZoQw1sbJ0lhTrgJNY/52GVFg+Se1ObU3Oue9viI3rupl8yzBEFo=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
291 B
682 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=5224969070
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:47 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
333 B
1000 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=8581068984
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.41 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-41.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sun, 17 Mar 2019 18:48:24 GMT
Via
1.1 e0bc02299b03254b2a35b8c930f005c6.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
25
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
333
Last-Modified
Wed, 16 Jan 2019 08:53:40 GMT
Server
AmazonS3
ETag
"36e7925e19d21a2047551ef140961e54"
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
EmDMcnv5nZUjzz7CcOp9oMBi2tkliA45BRMFd8g3589lLj6GGwZybw==
Expires
0
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/ Frame BD7B
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-32/html/container.html?n=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3971
date
Wed, 13 Mar 2019 18:39:19 GMT
expires
Thu, 12 Mar 2020 18:39:19 GMT
last-modified
Wed, 06 Feb 2019 20:59:52 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
346168
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
osd.js
www.googletagservices.com/activeview/js/current/ Frame 0459
75 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
ea8709c333523eaa79e47d2670f5bbb49c469bf52de4d4c5d4b83571ec14da65
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
27825
x-xss-protection
1; mode=block
expires
Sun, 17 Mar 2019 18:48:47 GMT
truncated
/ Frame 0459
209 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
6c95b2483025e69b76e468093cf579c07c01cc633ca03365859b4f2e93831daf

Request headers

Response headers

Content-Type
image/png
/
ssl.3.damoh.golem.de/10be3e18a537a04609e46d05aa55a333b330220a/
333 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.golem.de/10be3e18a537a04609e46d05aa55a333b330220a/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
213.239.199.112 Nürnberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.213-239-199-112.clients.your-server.de
Software
AmazonS3 /
Resource Hash
a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
ssl.3.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
87
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 17 Mar 2019 18:48:48 GMT
Connection
keep-alive
Content-Length
333
Last-Modified
Wed, 16 Jan 2019 08:53:41 GMT
Server
AmazonS3
Etag
"36e7925e19d21a2047551ef140961e54"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de6-homad-3
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.golem.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
hic_qos
ssl.1.damoh.golem.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.golem.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.65.40 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.40.65.243.136.clients.your-server.de
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:48 GMT
Last-Modified
Mon, 03 Sep 2018 14:21:38 GMT
Server
openresty/1.13.6.2
ETag
"5b8d4372-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 4DAD
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d4bb1ad027f54caf04d8ada931b47816bfa2b718a139021aadf660798f840046

Request headers

Response headers

Content-Type
text/javascript
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=e748d273c.878727aab_1552848528523&1552848528523
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:48 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
ssl.3.damoh.golem.de/4d7e43c3078555cde4f9aef6a33aa440a82487ac/
110 B
672 B
XHR
General
Full URL
https://ssl.3.damoh.golem.de/4d7e43c3078555cde4f9aef6a33aa440a82487ac/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.139.104 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.104.139.251.148.clients.your-server.de
Software
TornadoServer/4.5.3 /
Resource Hash
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
ssl.3.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Cookie
__io=e748d273c.878727aab_1552848528523
Connection
keep-alive
Content-Length
371
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sun, 17 Mar 2019 18:48:48 GMT
Server
TornadoServer/4.5.3
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
110
pd
eu-u.openx.net/w/1.0/ Frame 9557
Redirect Chain
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
173.241.240.143 New York, United States, ASN36089 (OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
Reverse DNS
ox-173-241-240-143.xa.dc.openx.org
Software
OXGW/16.121.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
i=12564c99-3c4c-0a91-20bb-095f29159657|1552848529
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

status
200
vary
Accept
set-cookie
i=12564c99-3c4c-0a91-20bb-095f29159657|1552848529; Version=1; Expires=Mon, 16-Mar-2020 18:48:49 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1552848529|mOgikimWiygu; Version=1; Expires=Mon, 01-Apr-2019 18:48:49 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.121.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Sun, 17 Mar 2019 18:48:49 GMT
content-type
text/html
content-encoding
gzip

Redirect headers

status
302
set-cookie
i=12564c99-3c4c-0a91-20bb-095f29159657|1552848529; Version=1; Expires=Mon, 16-Mar-2020 18:48:49 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.121.0
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
date
Sun, 17 Mar 2019 18:48:49 GMT
content-length
0
usync.html
eus.rubiconproject.com/ Frame B46D
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.230.142 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-230-142.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

Host
eus.rubiconproject.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Thu, 07 Mar 2019 18:37:22 GMT
Content-Encoding
gzip
Content-Length
7419
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=22488
Expires
Mon, 18 Mar 2019 01:03:37 GMT
Date
Sun, 17 Mar 2019 18:48:49 GMT
Connection
keep-alive
Vary
Accept-Encoding
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6AJMOBAUkzFFCPKAAAAAAAABj3TAPDAAFAAj3TTDOpAZAAAOA55A55A85B55A58E55A55AFA4xAz3A5BErDOpAPVDA/IAAAAH0mcAPAAAXUAAAAHVEfAPBAAAAAAAAIhRjAPAAAhPA6DBHDOpASksF+GjAAAAAAAAAAAAEAAAj3TAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEEAu1FssFKAHvFvnFslFgBEkYFAAAAIAzzA3wA5zA31AEAu1FssFKAylFj0FhuFnsFlyBEAu1FssFEAu1FssF4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdhPA6DBtEA6DAFAAADOpAAAGBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAzyAvoE0tFsvBjvFu0FhpFulFyuBo0FtsFPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF2rEITA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:50 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:49 GMT
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6AKoZBATkzFARksFAQtjFIwJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:51 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:50 GMT
data
lb29.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb29.s400.meetrics.net/data?/Lc6ALoZBA/k0FHVmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9zAz3Aw5Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF9uE1sFsmBjpFk9Bu1FssFmzEp6Fl9B53Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9Bu1FssFmhEwkF9uE1sFsmBhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9HEvvFnsFlgBBkFYmBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA23A03AmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9xA04AyzAy4A05A1mAjwFpkF9kElzFr0FvwFmhEwhF90A50A31Aw3AzzA1mAjpFk9BxzA4yA2wAwyA44AwxAmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A50A31Aw3AzzA1mAhwFk9B05A03A1wA3zAz1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11Ay4A04A1yA3yAwwAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F9xA04AyzAy4A05A1mAjwFpkF9kElzFr0FvwFmhEwhF90A50A31Aw3AzzA1mAjpFk9BxzA4yA2wAy3A23AxwAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BihFuuFlyFmhEwjF90A50A31Aw3AzzA1mAhwFk9B05A03A1wA3zAz1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A1yA40A41Ay3AywAzmEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29BzzA3wA5zA31AmjEwpFk9BklFzrF0vFwmBhwFh9Bu1FssFmjEpkF9uE1sFsmBzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlyBmhEwjF9uE1sFsmBhwFk9Bu1FssFmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFymAhkFj9BHvFvnFslFgBEkYFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A1yA40A41Ay3AyxA1mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay1A0zA04A2zA3mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A1yA40A41AzxAzwA0BETkzFARksFAQtjFxqJAdA
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:51 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Sun, 17-Mar-19 18:48:50 GMT
api
tracking.m6r.eu/sync/
Redirect Chain
  • https://cdn.m6r.eu/sync/api
  • https://tracking.m6r.eu/sync/api?checkcookies=true
1 KB
1 KB
Script
General
Full URL
https://tracking.m6r.eu/sync/api?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.45.237.209 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-45-237-209.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
5ccef4c578bc4792e27c6b094f421f3948add858035cf045a8471cbe2d7d59ed

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:52 GMT
Content-Encoding
gzip
Last-Modified
Thu, 14 Mar 2019 15:38:01 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
642

Redirect headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:52 GMT
Server
nginx
Vary
Accept
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/api?checkcookies=true
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
72
Expires
Sun, 17 Mar 2019 18:48:52 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 0459
42 B
122 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstrUdmMEwY8eyzR_eUj58kE4O1xsVENitIV3AnLupvsYV1NGu4Zc5PQIXxzpUSUIVktZWeZGGI8oSdH6GJdA1E6qpA9bjanYtaIh3g&sig=Cg0ArKJSzCUItBOZnVWXEAE&adk=2964933683&tt=-1&bs=1585%2C1200&mtos=0,0,1042,1042,1042&tos=0,0,1042,0,0&p=878,993,1479,1293&hac=2&mcvt=1042&rs=3&ht=0&tfs=5761&tls=6803&mc=0.53&lte=0.53&bas=0&bac=0&avms=geo&rst=1552848527065&rpt=4245&isd=0&msd=0&lm=2&ext=mvo%3D-1%26brt%3D4204&oseid=3&xdi=0&ps=1585%2C12113&ss=1600%2C1200&pt=-1&deb=1-3-8-116-60-23-610-58&tvt=6789&r=v&id=osdim&vs=4&uc=43&upc=1&tgt=DIV&cl=1&cec=12&clc=1&cac=0&cd=300x600&v=20190313
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:808::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Sun, 17 Mar 2019 18:48:52 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
42
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n3=1&n4=0&n5=5&n6=2&n7=2&n8=5&n9=0&n10=1&n11=1&n12=6&n17=4&n18=2&n20=2&n21=4&n33=4&n38=2&n39=4&n43=3&n44=3&n46=4&n52=2&n57=3&n58=4&n60=3&n62=3&n67=0&n75=0&n76=1&n77=0&n78=1&n79=1&n80=0&n81=1&n82=1&n83=0&n84=0&n85=1&n86=0&n87=0&n88=1&n117=2&n118=6&n119=3&n120=2&n121=2&n122=1&n123=2&n127=0&n128=2&n135=9&n15=1&n66=1&n89=2&n90=1&n92=1&n93=3&n94=2&n97=1&n98=1&n99=1&n101=1&n104=1&n106=1&n107=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n153=1&n154=1&n155=1&n156=1&n157=1&n158=1&n159=1&n160=1&n161=1
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.45.237.209 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-45-237-209.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
f64eeba891cbd69c46841e3d6f6d7cf9575bb41e83a9f13f93a76b19d0f6a6ec

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:52 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1507
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=c012fc72aaabea188ef69a127cd06815&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dc012fc72aaabea188ef69a127cd06815%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=c012fc72aaabea188ef69a127cd06815&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dc012fc72aaabea188ef69a127cd06815%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c012fc72aaabea188ef69a127cd06815&userId=adscale-user:454941552848532931
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c012fc72aaabea188ef69a127cd06815&userId=adscale-user:454941552848532931
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.45.237.209 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-45-237-209.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:53 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:53 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c012fc72aaabea188ef69a127cd06815&userId=adscale-user:454941552848532931
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Sun, 17 Mar 2019 18:48:53 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=c012fc72aaabea188ef69a127cd06815
43 B
850 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=c012fc72aaabea188ef69a127cd06815
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:54 GMT
AN-X-Request-Uuid
875735d0-3129-4fb1-888c-cd0a7a7f5494
Content-Type
image/gif
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
X-Proxy-Origin
89.249.64.197; 89.249.64.197; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.144:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=c012fc72aaabea188ef69a127cd06815
Date
Sun, 17 Mar 2019 18:48:52 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
98
Content-Type
text/plain; charset=utf-8
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=wBL8cqqr6hiO9poSfNBoFQ
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=wBL8cqqr6hiO9poSfNBoFQ&google_tc=
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
523 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.45.237.209 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-45-237-209.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:52 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Sun, 17 Mar 2019 18:48:52 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
260
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=c012fc72aaabea188ef69a127cd06815
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=c012fc72aaabea188ef69a127cd06815
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:52 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sat, 16 Mar 2019 18:48:52 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=c012fc72aaabea188ef69a127cd06815
Date
Sun, 17 Mar 2019 18:48:52 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.45.237.209 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-45-237-209.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:53 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.100.198.56 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a95-100-198-56.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
64d36d1aeede6488eafcd8844abb6ea473c9e8bda92b79b51517716cc9d90953

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

x-amz-version-id
TLhtcFPPAupi0UX8Xq99nxFrz5oZchFU
Content-Encoding
gzip
Last-Modified
Mon, 04 Mar 2019 03:15:18 GMT
Server
AmazonS3
x-amz-request-id
C931A647C066DFAF
ETag
"0253570faeffb9f0f2478d761e0edfa7"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Sun, 17 Mar 2019 18:48:53 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5428
x-amz-id-2
4JLhTFBjtVHR0vXTwM7PDSEQxkvMuU6QknunpKWdEXV6ZFt8GrqLQagnIoQYPVGWOW9NmPA86hE=
adex.js
dmp.theadex.com/d/607/2256/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/607/2256/s/adex.js?ts=74113951
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.109 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
7e93e57c5fca59d7f6d192261b7b82bc50db5128bab9a768699398b2e3e8bab3

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 18:48:53 GMT
content-encoding
gzip
last-modified
Thu, 31 Jan 2019 19:24:11 GMT
server
nginx
etag
W/"5c534b5b-9c4e"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Sun, 17 Mar 2019 18:53:53 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1014 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.118 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn2.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:53 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:12:02 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Sun, 24 Mar 2019 01:27:42 GMT
default.js
ups.xplosion.de/loader/69511/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/69511/default.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.144.109 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-144-109.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
97cd1bc4baa1de053750912b417b969fa704faeedaaab7ad51ac5276c51e14c6

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:53 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1543
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
673 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=92345649&src.id=Stroeer
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.186.28 Frankfurt, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-186-28.eu-central-1.compute.amazonaws.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:53 GMT
Server
Apache
P3P
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Type
image/gif;charset=UTF-8
Content-Length
43
X-Application-Context
application
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p.min.js
cdn.emetriq.de/adp/profiling/0.2.1/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200c:c00:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Thu, 13 Dec 2018 13:56:26 GMT
content-encoding
gzip
last-modified
Thu, 13 Dec 2018 13:47:28 GMT
server
AmazonS3
age
8139148
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
hiWj6aE8JHqtrvyMwCZ_m8sYL51hXzoR
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
uR6gfJNY78-Ap1LO6jXyGgEmQ-6t6wn5abucl0Z_ul1REGeTJYFslg==
via
1.1 e7c35757c4581d46396ae4c0a48815ef.cloudfront.net (CloudFront)
Cookie set map
ih.adscale.de/ Frame F651
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.100.198.56 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a95-100-198-56.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
uu=454941552848532931; tu=4#2722340650#48~c012fc72aaabea188ef69a127cd06815~431346~0~0
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Sun, 17 Mar 2019 18:48:53 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:53 GMT
Content-Length
588
Connection
keep-alive
Set-Cookie
tu=4#3441225475#48~c012fc72aaabea188ef69a127cd06815~431346~0~0#68~~431346~431346~1#101~~431346~431346~1#38~~431346~431346~1#72~~431346~431346~1#42~~431346~431346~1#75~~431346~431346~1#60~~431346~431346~1#63~~431346~431346~1; Domain=ih.adscale.de; Expires=Tue, 16-Apr-2019 18:48:53 GMT; Path=/
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&mbr=7ab9b39123575de786470ffaac3f9202&event_id=page_view&_sid=69511&_ver=0.2.1&_seg=jsonp&_=564633019688
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.144.109 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-144-109.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
7cf963b6c40b7fde747ba121de3e0bdaa0a6f6277ea6f94038d274c38995e744

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:53 GMT
Content-Encoding
gzip
Server
Apache-Coyote/1.1
Vary
Accept-Encoding
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1778
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.75.246 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-75-246.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 08:23:31 GMT
Content-Encoding
gzip
Last-Modified
Sun, 17 Mar 2019 08:23:30 GMT
Server
akka-http/10.1.7
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa0BDJ8EiasBs_CEif-BiUABifkBSfsWsfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1001320161948530272&axd_pid=22&axd_fuid=BSa0BDJ8EiasBs_CEif-BiUABifkBSfsWsfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3...
  • https://uss.xplosion.de/usersync?sid=65966&fpid=1001320161948530272
42 B
832 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=1001320161948530272
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.144.109 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-144-109.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:53 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
42

Redirect headers

status
302
date
Sun, 17 Mar 2019 18:48:53 GMT
access-control-allow-credentials
true
server
nginx
p3p
CP="CAO PSA OUR"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=1001320161948530272
content-type
text/html; charset=UTF-8
segments
api.theadex.com/v0.9/pub/
140 B
211 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.125 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
034d63d5ae8dd718e7a38bbd336fae2ae8bd1dd02baf156a49e60921ae40c7fe

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Sun, 17 Mar 2019 18:48:53 GMT
content-length
140
content-type
text/plain; charset=utf-8
activation
adstax-match.adrtx.net/ Frame 6249
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.245.249.125 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-245-249-125.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Sun, 17 Mar 2019 18:48:53 GMT
Server
akka-http/10.1.7
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
usersync
uss.xplosion.de/
42 B
832 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=7ab9b39123575de786470ffaac3f9202
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.144.109 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-144-109.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 17 Mar 2019 18:48:53 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1552848536983
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Sun, 17 Mar 2019 18:48:57 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT

Failed requests

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

Domain
hb.adscale.de
URL
https://hb.adscale.de/dsh

Verdicts & Comments Add Verdict or Comment

158 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| onselectstart object| onselectionchange function| queueMicrotask object| Golem object| _gcpx string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW object| _gafccsi 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 object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| yieldlove_site_settings object| YLHH object| yieldlove_cmd function| pbjsYLHHChunk object| __core-js_shared__ function| JSEncrypt string| logLevel object| clrm object| GPT_jstiming boolean| google_measure_js_timing function| $ function| jQuery object| iAbo function| golemAcceptCookies object| stroeerCore boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id number| google_unique_id object| google_reactive_ads_global_state object| gaGlobal object| google_ad_modifications object| adsbygoogle boolean| deliveringAds boolean| subDomainCheckVar function| RLLYdd object| rllly8beFlags string| rllly366Rnd object| rlllyde60tc object| google_sa_queue object| google_sl_win function| google_process_slots function| google_spfd number| google_lpabyc object| google_sv_map object| google_t12n_vars function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| google_pub_config object| __google_ad_urls number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy function| Goog_AdSense_getAdAdapterInstance boolean| google_osd_loaded boolean| google_onload_fired function| Goog_AdSense_OsdAdapter object| de_meetrics function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb string| szmvars object| iom object| iam_data object| _io_config string| disableStr object| _gaq boolean| rllly7d5sdl boolean| rllly7d5sdln string| rlllyde60genat string| rlllyde60sthash boolean| rllly821forceimp boolean| rllly09cnewinject boolean| rllly8ceBody boolean| rlllyd43Detect object| rllly91aMobile object| rlllyde601 object| rlllyde60o1 object| rlllyde60o2 object| rlllyde60o3 object| rlllyde602 number| rlllyde60d3 object| rlllyde604 object| rlllyde605 boolean| rllly6bcij object| _gat function| Swiper object| rmp3pi function| SwfVideo object| exportz object| f object| core object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock function| mb function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima object| google object| closure_lm_124118 object| closure_lm_74030 object| __io object| oms_debug string| sdm_ift boolean| rlllye7cTrack object| OhleiDurooNotuph boolean| F object| Xw object| ix function| videopkgInterface string| _io_uniques_holing_params string| hic_qos object| NUGGjson string| n_pbt object| _m6rq number| _m6rApiLoaded object| _m6rOnce number| _m6rContainerLoaded function| _h object| _adexc object| adex object| _EQLService object| _EQPScript object| _EQPService object| _emqAdexGif object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr object| ibb_lib

2 Cookies

Domain/Path Name / Value
.doubleclick.net/ Name: IDE
Value: AHWqTUnytSY6jjanWh0MPPPzvxBO11YBLTIKRwMiPuQJ5w3IfRZ2T6EHOnyB_8Em
www.golem.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6ImtkQzgiLCJ0c2wiOjE1NTI4NDg1MzMsIm52IjowLCJ1cHQiOjE1NTI4NDg1MjUsImx0IjoxNTUyODQ4NTI1fV0.

1 Console Messages

Source Level URL
Text
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1

Security Headers

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

Header Value
Strict-Transport-Security max-age=11001100; includeSubDomains; preload

Indicators

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

ad.yieldlab.net
ad2.adfarm1.adition.com
ads.golem.de
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
api.theadex.com
bbcdn-bbnaut.ibillboard.com
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.emetriq.de
cdn.m6r.eu
cdn.onthe.io
cdn.radiantmediatechs.com
cdn.stroeerdigitalgroup.de
cm.g.doubleclick.net
cpx.golem.de
cpxl.golem.de
de-gmtdmp.mookie1.com
de.ioam.de
dmp.theadex.com
eu-u.openx.net
eus.rubiconproject.com
fastlane.rubiconproject.com
golem.de
googleads.g.doubleclick.net
hb.adscale.de
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
js.adscale.de
lb29.s400.meetrics.net
pagead2.googlesyndication.com
s0.2mdn.net
s3.amazonaws.com
s400.mxcdn.net
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl.1.damoh.golem.de
ssl.3.damoh.golem.de
ssl.google-analytics.com
stats.g.doubleclick.net
tpc.googlesyndication.com
tracking.m6r.eu
tracking.yieldlove-ad-serving.net
tt.onthe.io
ups.xplosion.de
uss.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagservices.com
xpl.theadex.com
yieldlove-d.openx.net
hb.adscale.de
104.109.68.123
104.111.230.142
13.35.253.115
13.35.253.41
13.35.253.85
136.243.3.132
136.243.65.40
138.197.186.29
148.251.139.104
172.217.16.194
172.217.21.194
173.241.240.143
173.241.240.220
185.33.223.216
213.19.162.31
213.239.199.112
217.79.188.21
23.45.237.209
2600:9000:200c:c00:1c:8c89:a300:93a1
2606:4700:30::6818:6724
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:1450:4001:808::2002
2a00:1450:4001:809::2002
2a00:1450:4001:80b::2008
2a00:1450:4001:815::2001
2a00:1450:4001:816::200e
2a00:1450:4001:81a::2002
2a00:1450:4001:81c::2002
2a00:1450:4001:820::2002
2a00:1450:4001:820::200a
2a00:1450:4001:821::2006
2a00:1450:400c:c08::9d
2a02:26f0:6c00:280::5f76
34.245.249.125
35.156.186.28
52.211.144.109
52.216.101.173
52.216.230.93
52.28.163.57
54.77.75.246
62.168.44.118
77.247.84.129
77.247.84.149
80.82.201.88
89.163.159.106
89.163.159.109
89.163.159.125
91.215.100.40
91.215.103.64
95.100.197.52
95.100.198.56
95.216.24.148
034d63d5ae8dd718e7a38bbd336fae2ae8bd1dd02baf156a49e60921ae40c7fe
04010089507165fd1954135b4dff919c5d3e951008c7c079600fae990820501c
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
0c6e638ad05d9f7a4209ab71f1da73c8324cfff78e4697a0a0ef360f192c0919
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
0fd8d39677a15d5ecfadaa78279f66259259bfe00698bd60856c0ed0b9516249
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
13850b41e27eef84f40517a3ed1d9c76132d4015f94bafbd274220a399a8fe31
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
180f7c727cc51c1b3cf7a1a4fa1c8fe35a97f68c2d8884c84eef8d854e22e491
1af61cbe886774756dfa4b5a58bf86c1291ad0360129fd73ecc51cdbf13a0b1f
1dfcc6b39f2dfdf8ac3b4c246ace16162ded9b98803a5941c9f4b51435b203bb
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
215440186151c5a33ed5759fd02f70f7911c719a316747b960e7ed2ab7f760f2
224a01642a00ad414adaa06251239d87ace9c850127bdd2fc4094034e51b60c5
24285f847959d70e18bef325a0d8517015b733e769c205bf8685f772c199cd90
25906438e762044e853f3019611572df70ac8e33b42eb3268cbbb297bf8006c4
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
278fb7557ae83b5f02c45dce216f48da3e1f76ea6cad31aa95614604d704ba8f
27c3d151e13b4b9c9f151554f94d470e57a0857c0f509dd22dc4517de5024f84
2d555c86f0e8276cef6143ffdcf22ed5612e2a83aad243b43dc79e2a5d2e39d3
2fbc3744b62ce3dc6bbfc3d4d7fab37e78f20aa24559f49f31ea8066f86c1e03
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
34f0850833ea2339f61d17475c7d5d228be8f1f56fd3f836ccb72f30fb9c75d4
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
386bc3ef6a539db164639c8f33b2c47694dca03548023d2e5dea731969b20e0e
38b7eea19be05ef8257f7c8f9576cbe1648a6ba6fe969383b9fdbbd423e660c1
39a6457aba5c0929a98f7a4646f9b1a4b6ef2d00eb89839a5413a84aa0a2535c
3a80b900c538dce6ded080e90ee6a3e25c9264181192f962dc62959412020681
3aecb525fc55187cf441ff3e7c94cb3f463bcbaec0a16e12f762d4285efcc855
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
3f08f61b37ba18badabe6a8df29a9945f4670bc7e2b7de267ae841bcf70f6fe4
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
454bcb9f2f2874cedb26b750abfad47ac675b6d77eba5d3ccea4400fc23858aa
4752c7a7898c850c1e5fe3da80447f5ebce463f8da44d5b9bcfd22d4dc6f1457
49113cf8e2d1c8fc14e2b30d7e94b3c07726d74897d366929a4d873a4b8f763c
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4b862283bb0b7628d0a044ee87ae769795382c60338e8690c5bd9a65261aec44
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
5119213ddf0a4c5f116618c4d0663fbf21721d60917432979406652404ff21d4
528f6796d8a079fe81dab570402ebe838c34d375c8d3ab0d1dea34416229a5cf
52aabdebe098d6e0d138c2661fda802dd50f5890da0d150967908838c9e20b24
5301775b295f2c96aef07a45eebcd0e9073415f19abe57d044ac7b240804dcf2
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
59411aff3890b0ae31175276ddbedae3e9610e2e2cfa04aff131470d03fafb8b
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5afa0b7c384d82c48babd89be5f8afd9e250302162dfa427f9680e091b0d51d1
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5ccef4c578bc4792e27c6b094f421f3948add858035cf045a8471cbe2d7d59ed
5e7a32e68bc51963a8cf9d8256490205a2d22e5dfdc5a849d26511879709535c
613fee01cd25e853f87abcd81f331e90ccd445b69d522cd9877e9f84edcd6a51
6190c992cdddb49e273ae8d06e497e43580f81f0258dcfbe6cda2be987a14fa1
61d1954b9aba0c9aedb8d1338804e817c7262cfc36da94161dab8e3ed7a3a43a
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
64d36d1aeede6488eafcd8844abb6ea473c9e8bda92b79b51517716cc9d90953
6549a32ed07cf453ac36fc4d2b517948d448104a74d4dec067b40e9d610a7cbb
66caa05cdc0aa916bc05695a31f9ae2d0c93de89914697b24287fba06058676e
6c95b2483025e69b76e468093cf579c07c01cc633ca03365859b4f2e93831daf
6f92b53295df3853f4f12040e7d0986ac00efa2a35f15c884ee785fd16018569
75cbe13cf1d23ab8bc8f89ad68544db241052ef13726f724fece9f4fbe20f86e
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76c89f30a537c7330350de97c8eb97554f54a1155b212cc7fcb5b732b9c83e8e
76fc061c0fd7a0978880ed26ede6ec00ae82798408b18947187513a047f2a002
79585ce2613d27fccf5228affdce09e12346155d22c276aa18330b78144ac276
7cf1e8250ca23c04fbd7fd6d2817db0a2bd268e467fbbda458cf1fbdf17fb491
7cf963b6c40b7fde747ba121de3e0bdaa0a6f6277ea6f94038d274c38995e744
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
7e93e57c5fca59d7f6d192261b7b82bc50db5128bab9a768699398b2e3e8bab3
81853f15c5bef476fe9d074c009a68fbd05fb2ee84d1ae2cccef492f2d7068a6
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
82e749665c7912ccff1cd83d97600274bf39815363ef0b6cc95d5fc5a9475dc1
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
86f7eae1f6f765dadc959968a1b5e152269ea620a39eba743fd8691762e2c484
875664108fc0fcfe834d960dd1c9bc4ae792a77e371f253ebafecaa041095881
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
9338f1a6f40d5623b62485ecb9fc3b2b6d3728652b72e7eddf4bd819ecd67d7d
971b2a08a5960a24b737eafc0d90ad6028d0474a880d315215afe64eb8480076
97cd1bc4baa1de053750912b417b969fa704faeedaaab7ad51ac5276c51e14c6
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9ea7e4ae860137df77a0ab24a3c105a2d6e9ab25a9b7cb84f64c191c9c17eb5d
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a0ab5f484ba7935f1ec9a1fd3fa7b1d4fb8177c6ced35cefc442ae36425dd05b
a1e2793e666d4551fe411ffa48f31946df6112565504a27e4b6465db35bb3bea
a62742217173c543ccb355b781152fef0e53f4eebd0fd6163be3004955a8beca
a62f5daff85d4695d52eb94efef62aea68deb1eb2baaa3c6463d6f95dadbb240
a7bef17b2ce10ee929c74c24fac274c8e052589881e230ffedfefac359f16951
ab1879106759e586360973f1d090a0cf78387bfa7589411255ffe5be406ce9fd
ac024d7beb9ce29c7d360467421a8535c926305f0b8058e59486199b733883c3
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
bb625be9acda8602cebced8a7ee968d86b274c72e808094bcc59208f485043a3
c11b9a046106f278a5fb5411e95c1ba5d6f06daf9e4bfa98da51c523e4157388
c192ccba6e2b0c7154d5bbccec1270b0aea42ff58b9b5b95585592e245dc5e70
c6245b45ab43ac6bcda0ee9129c3be212874412ed93d583682e6ab8f36d49fa1
c92d0dfae0cae4a547d77592bcbc24905a4179ecbb0977b202b4848df486d0c1
ca30b113c3a09c1d088db62134c3827b5663df79c6f775dcffed84ffeacc0c86
cd6b2305a62d97e63e7f587e6a14bc2917c318706aa86f342171b001ab8912c9
cf65e308f1c461e06038b45d5bfa27689e22241f6b673b7d540d35cdd0ca4c32
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d01cb419e4efc09c07fecfe480bdf41046b691f4df2f0f4e1dcd19bcfedafac9
d14607e74d1b593d5c81ed82c27efe350ac4793528423e77bf44065b0111bb41
d18638555319c36f905dfec62892cea2b8e7d8e6265ee5d3d8bfd487ae6214b6
d1990310b85fe70c2956480b8a9e2655a74867758174759a55cd4aa62240da90
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d4bb1ad027f54caf04d8ada931b47816bfa2b718a139021aadf660798f840046
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d6305c6ca4187969344afb4397344a451f65786537f4f54302c59f38c07f0a9d
dc7ae7eadcf312b9c3a0c4cdd7ee55c8e3ac1628b49cb91eab5311827b79f2c1
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e4905f6f551766efb54734d3be6981eb47073c6921ed9a3374aa579f6717eabc
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e80f35da44eb3fdedeb6b3473fd53a2704bb690d624e9375fb0db6962f5e35a5
e91846fe88a7f9a2302909fa9ecba900c243c536fbd239bf479b2b21839371f7
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ea8709c333523eaa79e47d2670f5bbb49c469bf52de4d4c5d4b83571ec14da65
ebcd221d528108f8908d8f49bd1b9c67a0660c22e89eed3fcf143dceb37f30d5
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ee7d2c527361489a36f391f25fe5fb0da87a0cd4d09a976964e6fbf565102a21
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f64eeba891cbd69c46841e3d6f6d7cf9575bb41e83a9f13f93a76b19d0f6a6ec
f6946991ed9a7582a26b10c478921ab4a95e74f789c664394615bfacb41a67cc
f817234ee0568bd6b081361621202326ae21b9c5b7d03f62f4b05ee533339e03
fa1ef5ada57aee13df27471b97964993e328305da6f3c7e5887bab16f2fd39ed
fc150075dfee7b25744936f241348d41bc153b8d599c2c40be293527d22789cb
fcc99ba4f114817ed22a449799e383fb052df033f635c1c45c546b2d5f4eb6e2
fd286e1b79b2e83abb640008b29b586f28c772b5719bd0701528b369ec3e963c
fe3318d2d645af0efbaafba323874818d582160c0355b08cd8749190fdebb5d4
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548
ff8e7c05336fd8e68146ecff903727f8016ccc488b50faa13ccc75699804ee36