Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On October 15 via manual from DE

Summary

This website contacted 51 IPs in 6 countries across 32 domains to perform 206 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 74 77.247.84.129 25291 (SYSELEVEN...)
2 77.247.84.128 25291 (SYSELEVEN...)
6 2a00:13c8:f5:... 25291 (SYSELEVEN...)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.103.64 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
7 2a00:1450:400... 15169 (GOOGLE)
14 2.18.235.40 16625 (AKAMAI-AS)
1 2600:9000:200... 16509 (AMAZON-02)
2 143.204.96.211 16509 (AMAZON-02)
1 1 34.254.168.35 16509 (AMAZON-02)
2 52.212.18.79 16509 (AMAZON-02)
3 2.18.232.23 16625 (AKAMAI-AS)
1 89.163.159.117 24961 (MYLOC-AS)
1 2600:9000:200... 16509 (AMAZON-02)
2 2.18.232.233 16625 (AKAMAI-AS)
2 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
12 172.217.16.162 15169 (GOOGLE)
1 52.94.216.48 16509 (AMAZON-02)
3 54.246.133.167 16509 (AMAZON-02)
1 52.56.194.133 16509 (AMAZON-02)
2 54.154.86.186 16509 (AMAZON-02)
1 1 66.117.28.86 15224 (OMNITURE)
1 185.33.223.220 29990 (ASN-APPNEXUS)
1 178.250.2.89 44788 (ASN-CRITE...)
1 2600:9000:200... 16509 (AMAZON-02)
13 2a00:1450:400... 15169 (GOOGLE)
1 52.212.57.107 16509 (AMAZON-02)
1 85.114.144.197 24961 (MYLOC-AS)
1 2 89.163.159.109 24961 (MYLOC-AS)
1 2001:16e0:10a... 12611 (RKOM R-KO...)
1 2 91.215.103.65 43407 (INFONLINE-AS)
1 104.248.100.80 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
1 172.82.228.19 15224 (OMNITURE)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 62.138.242.228 61157 (PLUSSERVE...)
1 1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 1 85.114.159.93 24961 (MYLOC-AS)
1 178.250.2.130 44788 (ASN-CRITE...)
6 188.40.114.5 24940 (HETZNER-AS)
1 52.208.127.173 16509 (AMAZON-02)
5 2a00:1450:400... 15169 (GOOGLE)
2 52.216.228.163 16509 (AMAZON-02)
3 143.204.101.112 16509 (AMAZON-02)
1 2606:4700:30:... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
1 136.243.65.40 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
2 46.4.55.20 24940 (HETZNER-AS)
1 136.243.151.13 24940 (HETZNER-AS)
206 51
Apex Domain
Subdomains
Transfer
95 golem.de
golem.de
www.golem.de
iqdtms.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.1.damoh.golem.de
2 MB
20 googlesyndication.com
tpc.googlesyndication.com
pagead2.googlesyndication.com
319 KB
18 doubleclick.net
securepubads.g.doubleclick.net
stats.g.doubleclick.net
googleads.g.doubleclick.net
124 KB
15 moatads.com
z.moatads.com
mb.moatads.com
px.moatads.com
438 KB
8 onthe.io
cdn.onthe.io
tt.onthe.io
19 KB
5 demdex.net
dpm.demdex.net
iqdigital.demdex.net
3 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
53 KB
3 yieldlab.net
ad.yieldlab.net
p.yieldlab.net
2 KB
3 theadex.com
dmp.theadex.com
xpl.theadex.com
15 KB
3 adobedtm.com
assets.adobedtm.com
67 KB
3 amazon-adsystem.com
c.amazon-adsystem.com
aax.amazon-adsystem.com
22 KB
3 ioam.de
script.ioam.de
de.ioam.de
10 KB
2 googleapis.com
imasdk.googleapis.com
79 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 google-analytics.com
www.google-analytics.com
ssl.google-analytics.com
17 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 google.com
adservice.google.com
342 B
2 google.de
adservice.google.de
342 B
2 xplosion.de
ups.xplosion.de
5 KB
2 emetriq.de
dyn.emetriq.de
cdn.emetriq.de
2 KB
2 cloudfront.net
dx6ctphzljkf1.cloudfront.net
d1pywvbolq0b04.cloudfront.net
32 KB
1 2mdn.net
s0.2mdn.net
10 KB
1 radiantmediatechs.com
cdn.radiantmediatechs.com
2 KB
1 criteo.net
static.criteo.net
12 KB
1 adition.com
dsp.adfarm1.adition.com
478 B
1 whitepaperdb.de
golem.whitepaperdb.de
1 omtrdc.net
iqdigitalmediamarketinggmbh.sc.omtrdc.net
2 KB
1 df-srv.de
d.df-srv.de
228 B
1 criteo.com
bidder.criteo.com
186 B
1 adnxs.com
ib.adnxs.com
712 B
1 everesttech.net
cm.everesttech.net
527 B
1 googletagservices.com
www.googletagservices.com
9 KB
206 32
Domain Requested by
73 www.golem.de www.golem.de
z.moatads.com
13 pagead2.googlesyndication.com www.golem.de
securepubads.g.doubleclick.net
pagead2.googlesyndication.com
12 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.golem.de
8 px.moatads.com www.golem.de
7 tt.onthe.io cdn.onthe.io
7 tpc.googlesyndication.com www.golem.de
securepubads.g.doubleclick.net
7 video.golem.de www.golem.de
text
6 z.moatads.com www.golem.de
6 cpxl.golem.de www.golem.de
5 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 ssl.1.damoh.golem.de text
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 dpm.demdex.net assets.adobedtm.com
www.golem.de
3 assets.adobedtm.com www.golem.de
assets.adobedtm.com
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 s3.amazonaws.com www.golem.de
text
2 de.ioam.de 1 redirects www.golem.de
2 xpl.theadex.com 1 redirects www.golem.de
2 iqdigital.demdex.net assets.adobedtm.com
www.golem.de
2 adservice.google.com www.googletagservices.com
pagead2.googlesyndication.com
2 adservice.google.de www.googletagservices.com
pagead2.googlesyndication.com
2 ad.yieldlab.net www.golem.de
2 ups.xplosion.de www.golem.de
cdn.emetriq.de
2 c.amazon-adsystem.com www.golem.de
c.amazon-adsystem.com
2 ads.golem.de www.golem.de
2 iqdtms.golem.de www.golem.de
1 s0.2mdn.net imasdk.googleapis.com
1 cdn.radiantmediatechs.com www.golem.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 static.criteo.net dx6ctphzljkf1.cloudfront.net
1 dsp.adfarm1.adition.com 1 redirects
1 stats.g.doubleclick.net www.golem.de
1 ssl.google-analytics.com 1 redirects
1 golem.whitepaperdb.de securepubads.g.doubleclick.net
1 cpx.golem.de www.golem.de
1 iqdigitalmediamarketinggmbh.sc.omtrdc.net assets.adobedtm.com
1 www.google-analytics.com www.golem.de
1 cdn.onthe.io www.golem.de
1 d.df-srv.de www.golem.de
1 p.yieldlab.net www.golem.de
1 cdn.adrtx.net www.golem.de
1 cdn.emetriq.de ups.xplosion.de
1 bidder.criteo.com dx6ctphzljkf1.cloudfront.net
1 ib.adnxs.com dx6ctphzljkf1.cloudfront.net
1 cm.everesttech.net 1 redirects
1 mb.moatads.com z.moatads.com
1 aax.amazon-adsystem.com c.amazon-adsystem.com
1 d1pywvbolq0b04.cloudfront.net www.golem.de
1 dmp.theadex.com www.golem.de
1 dyn.emetriq.de 1 redirects
1 dx6ctphzljkf1.cloudfront.net www.golem.de
1 www.googletagservices.com iqdtms.golem.de
1 script.ioam.de www.golem.de
1 golem.de 1 redirects
206 54

This site contains links to these domains. Also see Links.

Domain
video.golem.de
forum.golem.de
account.golem.de
jobs.golem.de
Subject Issuer Validity Valid
*.golem.de
GeoTrust RSA CA 2018
2018-07-27 -
2019-08-28
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
2018-09-25 -
2018-12-18
3 months crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2018-09-25 -
2018-12-18
3 months crt.sh
moatads.com
DigiCert ECC Secure Server CA
2018-01-09 -
2019-01-09
a year crt.sh
*.cloudfront.net
DigiCert Global CA G2
2017-11-22 -
2018-11-21
a year crt.sh
c.amazon-adsystem.com
Amazon
2018-03-12 -
2019-03-12
a year crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-03-06 -
2019-01-12
10 months crt.sh
assets.adobedtm.com
DigiCert SHA2 High Assurance Server CA
2018-04-06 -
2019-04-11
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-02-08 -
2019-02-08
a year crt.sh
*.google.com
Google Internet Authority G3
2018-09-25 -
2018-12-18
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2018-03-08 -
2019-03-08
a year crt.sh
*.demdex.net
DigiCert SHA2 High Assurance Server CA
2018-01-09 -
2021-02-12
3 years crt.sh
*.moatads.com
DigiCert SHA2 Secure Server CA
2018-04-27 -
2019-04-27
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2018-01-25 -
2019-01-25
a year crt.sh
*.criteo.com
DigiCert SHA2 Secure Server CA
2017-11-21 -
2018-11-26
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
*.df-srv.de
Thawte TLS RSA CA G1
2018-01-16 -
2019-12-12
2 years crt.sh
*.onthe.io
COMODO RSA Domain Validation Secure Server CA
2018-03-28 -
2019-03-28
a year crt.sh
*.google-analytics.com
Google Internet Authority G3
2018-09-25 -
2018-12-18
3 months crt.sh
*.sc.omtrdc.net
DigiCert SHA2 High Assurance Server CA
2016-05-04 -
2019-05-23
3 years crt.sh
golem.whitepaperdb.de
Let's Encrypt Authority X3
2018-09-04 -
2018-12-03
3 months crt.sh
*.criteo.net
DigiCert SHA2 Secure Server CA
2017-11-21 -
2018-11-26
a year crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-08-02 -
2019-10-25
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2018-08-09 -
2019-09-09
a year 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
2018-09-25 -
2018-12-18
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2018-09-26 -
2018-12-25
3 months crt.sh
*.doubleclick.net
Google Internet Authority G3
2018-09-25 -
2018-12-18
3 months crt.sh

This page contains 21 frames:

Primary Page: https://www.golem.de/
Frame ID: B9F5C3B1D03B8C2997D19197FB7357DE
Requests: 174 HTTP requests in this frame

Frame: https://iqdigital.demdex.net/dest5.html?d_nsid=0
Frame ID: 810314FDC6D33EC9D391B850B8A36D1C
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Frame ID: 80A3FDC5435F8BB0B22FA784E6B9EFCC
Requests: 3 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Frame ID: 1338C27505D01787FE839F40F4B2A5CD
Requests: 3 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Frame ID: 3F4AFB5D51048C3A31EED35B384284FB
Requests: 9 HTTP requests in this frame

Frame: https://golem.whitepaperdb.de/?tag=golem
Frame ID: 32698A893511DC65DB0DB2FF212F0731
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Frame ID: 8D920B5E620566D0C3CF79783E65C97F
Requests: 5 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Frame ID: 54F3C607B4A70A420A2504DEE145F0B9
Requests: 3 HTTP requests in this frame

Frame: https://www.golem.de/microsite/abo/trial-medrec-m7-140.shtml
Frame ID: FE5C3E8E0C24822157F1A5A115AE34A8
Requests: 2 HTTP requests in this frame

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

Frame: https://googleads.g.doubleclick.net/pagead/html/r20181008/r20180604/zrt_lookup.html
Frame ID: 078A694833743775041F9F6ACACDDA0A
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Frame ID: 89136A88C52E8260FB490910A70F4951
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=3446949021&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500875&bpp=29&bdt=2697&fdt=37&idt=564&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&correlator=7497780083675&frm=20&pv=2&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=4021&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=636311223&ifi=6&fsb=1&xpc=mrJp7zaLeQ&p=https%3A//www.golem.de&dtd=597
Frame ID: 46C352BD04A439E21B48D87ED8BE7D9E
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Frame ID: 66A802EBA550248727B8A59C68F6C23B
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=2459742235&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500912&bpp=20&bdt=2734&fdt=685&idt=686&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=7497780083675&frm=20&pv=1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=4782&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=1823298079&ifi=7&fsb=1&xpc=iFfBv6gKMH&p=https%3A//www.golem.de&dtd=695
Frame ID: DA7078FD100F69BE6D550D718C6B17C0
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Frame ID: EE7854604CBA150D61555796B2E5E653
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=653379571&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500932&bpp=6&bdt=2755&fdt=800&idt=812&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=7497780083675&frm=20&pv=1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=5484&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=154924829&ifi=8&fsb=1&xpc=jLLzjGfNMC&p=https%3A//www.golem.de&dtd=834
Frame ID: E99D530D40796A592926AB4E7C4338BF
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Frame ID: 47DFD92E75F66890F8D9E856D225214A
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Frame ID: ABE42380F8213468490B8D7443E262F0
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=3930630304&adf=3574163827&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1539602501226&bpp=14&bdt=1528&fdt=1346&idt=1348&shv=r20181008&cbv=r20180604&saldr=aa&correlator=7497780083675&frm=23&ife=4&pv=2&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=216572098&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=11470&biw=1585&bih=1200&isw=800&ish=250&ifk=3088420174&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=1457
Frame ID: 2FA0D8C4B20C298B70C542CE2E8A4D36
Requests: 1 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.242.3_de.html
Frame ID: 80A897D463EADC7FB69E565E93B3F008
Requests: 1 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. http://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 /^criteo/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i
  • 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 /^s_(?:account|objectID|code|INST)$/i

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

Page Statistics

206
Requests

98 %
HTTPS

37 %
IPv6

32
Domains

54
Subdomains

51
IPs

6
Countries

3238 kB
Transfer

7282 kB
Size

0
Cookies

Page URL History

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

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

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 25
  • https://dyn.emetriq.de/loader/97578/default.js HTTP 302
  • https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Request Chain 52
  • https://cm.everesttech.net/cm/dd?d_uuid=10813531654945682143188154401728892417 HTTP 302
  • https://dpm.demdex.net/ibs:dpid=411&dpuuid=W8R4QwAACfgg9RKk
Request Chain 71
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1001618631321390153&axd_pid=22&axd_fuid=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr
Request Chain 73
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0&lt=1539602499878&ev=&cs=k53yq6&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0&lt=1539602499878&ev=&cs=k53yq6&mo=1&sr=71
Request Chain 141
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=895175949&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=730356177&utmr=-&utmp=%2F&utmht=1539602500677&utmac=UA-518800-2&utmcc=__utma%3D21769261.1893485975.1539602500.1539602500.1539602500.1%3B%2B__utmz%3D21769261.1539602501.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=1225137513&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=1893485975.1539602500&jid=1225137513&_v=5.7.2&z=895175949
Request Chain 143
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fdpm.demdex.net%2Fibs%3Adpid%3D385489%26dpuuid%3D%25%25COOKIE%25%25 HTTP 302
  • https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6612542386376275987

206 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://golem.de/
  • https://www.golem.de/
176 KB
177 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
37df35d3239bc1ef2607da996cfbf534d44fb6d14f18e069b58bcc6b40094b22
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
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
Mon, 15 Oct 2018 11:21:38 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, 15-Oct-2018 23:21:38 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=11001100; includeSubDomains; preload
Cache-Control
private
Vary
User-Agent, Accept-Encoding

Redirect headers

Location
https://www.golem.de/
Server
BigIP
Connection
Keep-Alive
Content-Length
0
golem_main_114-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_114-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
2bdb9058c86c9b82b28d52d721fb75df307033cac39891be256b4f74bbb1b083

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-12251"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Thu, 15 Nov 2018 11:21:38 GMT
iqd_gzip_test.js.gz
iqdtms.golem.de/
23 B
491 B
Script
General
Full URL
https://iqdtms.golem.de/iqd_gzip_test.js.gz
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.128 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec734c8897764322b10b819d78cc8933f050ba27cc3f971ee23ea91b9fdc958e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
iqdtms.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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Tue, 13 Jan 2015 08:41:49 GMT
Server
nginx
x-amz-request-id
EC1258A0006D842E
ETag
"1ec37da4a5d51c998484c055cc5ae466"
Content-Type
application/x-gzip
X-UPSTREAM
52.219.74.12:443 hybrid2.golem.de
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23
x-amz-id-2
xqUdHbF721N09Ub3JuJmLEyv6PFzG8DwlPyWh3SYgGwzcgjy4Q52ojD2RcKdnggcU+U4xHZ/M+c=
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
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-e82"
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
3714
Expires
Thu, 15 Nov 2018 11:21:38 GMT
136755-174672-174670_rc.jpg
www.golem.de/1810/
17 KB
17 KB
Image
General
Full URL
https://www.golem.de/1810/136755-174672-174670_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
7fcea5964a341a83cef5d4a34c392a84acb7d6be637b6682fdf0e88789fb2398

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Mon, 15 Oct 2018 10:01:04 GMT
Server
nginx
ETag
"5bc46560-436d"
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
17261
Expires
Thu, 15 Nov 2018 11:21:38 GMT
137114-176443-176439_rc.jpg
www.golem.de/1810/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1810/137114-176443-176439_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
94f413638bd2979f77ece1a8ba90a9a8df95b35c39ecc56229cd9eb07b6d93a7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Mon, 15 Oct 2018 09:33:04 GMT
Server
nginx
ETag
"5bc45ed0-1a48"
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
6728
Expires
Thu, 15 Nov 2018 11:21:38 GMT
137112-176434-176431_rc.jpg
www.golem.de/1810/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1810/137112-176434-176431_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
cb3a8fa506766029a3d52628ac44bf6ad94bc55797615606eef619b84c603d95

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Mon, 15 Oct 2018 08:53:05 GMT
Server
nginx
ETag
"5bc45571-216a"
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
8554
Expires
Thu, 15 Nov 2018 11:21:38 GMT
137111-176429-176426_rc.jpg
www.golem.de/1810/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1810/137111-176429-176426_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
c2c56acd0e19741271b335df083eb9e3213b00c18d070823b133e9d0565676cd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Mon, 15 Oct 2018 09:31:03 GMT
Server
nginx
ETag
"5bc45e57-2321"
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
8993
Expires
Thu, 15 Nov 2018 11:21:38 GMT
137113-176438-176435_rc.jpg
www.golem.de/1810/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1810/137113-176438-176435_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
8aa5ecb436d5726b7384465a17ebc79f18cc3581509af24644cd5aac34fdd298

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Mon, 15 Oct 2018 09:01:05 GMT
Server
nginx
ETag
"5bc45751-1fc4"
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
8132
Expires
Thu, 15 Nov 2018 11:21:38 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=1539601741&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
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
Mon, 15 Oct 2018 11:21:38 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
780
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
tourbox.jpg
video.golem.de/teaser/1/1/21945/thumb-high-1000/
52 KB
52 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21945/thumb-high-1000/tourbox.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
5a27f0a4435afbed756504770086d26323ff077b2b75c5fa122509f2ebf7fe33

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Sun, 14 Oct 2018 21:09:24 GMT
Server
nginx
ETag
"5bc3b084-ce40"
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
52800
Expires
Thu, 15 Nov 2018 11:21:38 GMT
1539162941_hqdefault.jpg
video.golem.de/teaser/1/1/21934/thumb-high-1000/
27 KB
27 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21934/thumb-high-1000/1539162941_hqdefault.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
13906fcafbb0d1ba3ca337243167024200875bb58a7bfd70da39c4c342672a4f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Wed, 10 Oct 2018 09:15:31 GMT
Server
nginx
ETag
"5bbdc333-6b92"
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
27538
Expires
Thu, 15 Nov 2018 11:21:38 GMT
137021-175959-175955_rc.jpg
www.golem.de/1810/
143 KB
143 KB
Image
General
Full URL
https://www.golem.de/1810/137021-175959-175955_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
767f30462b66c83a8102ae92e82faedd6dbe2cabeb12dc84e18c5df853c8c205

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Thu, 11 Oct 2018 10:15:07 GMT
Server
nginx
ETag
"5bbf22ab-23c55"
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
146517
Expires
Thu, 15 Nov 2018 11:21:38 GMT
137041-176120-176118_rc.jpg
www.golem.de/1810/
163 KB
163 KB
Image
General
Full URL
https://www.golem.de/1810/137041-176120-176118_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
9165223efb9daa9f4345a53773e072a5250ef4aafb9c9ad9b8231a7c3c51bd74

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Thu, 11 Oct 2018 09:05:06 GMT
Server
nginx
ETag
"5bbf1242-28aba"
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
166586
Expires
Thu, 15 Nov 2018 11:21:38 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=1539600841&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
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
Mon, 15 Oct 2018 11:21:38 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
779
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
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
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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-190c7"
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
Thu, 15 Nov 2018 11:21:38 GMT
longread-swiper_122-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_122-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
08b757c7ef1eaebe9fb2331abd30ecc0a470c2166994c1cfa941c126a698679c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Fri, 07 Sep 2018 13:24:16 GMT
Server
nginx
ETag
W/"5b927c00-8e6"
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
Thu, 15 Nov 2018 11:21:38 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
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Mon, 15 Oct 2018 11:21:38 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
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Thu, 15 Nov 2018 11:21:38 GMT
iam.js
script.ioam.de/
26 KB
9 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 0017
Resource Hash
77debc14932e6671687807adcbdcf346d00505a972d899677ae14186f420d768

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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Mon, 15 Oct 2018 11:21:38 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 0017
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
Mon, 15 Oct 2018 13:21:38 GMT
iqadcontroller.js.gz
iqdtms.golem.de/cdn_golem_dt/live/
196 KB
52 KB
Script
General
Full URL
https://iqdtms.golem.de/cdn_golem_dt/live/iqadcontroller.js.gz
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.128 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
bd9f60535bfec511504a1970dfb4de1533465cca024b7315239d19120cf79de3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
iqdtms.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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Wed, 26 Sep 2018 12:33:06 GMT
Server
nginx
x-amz-request-id
15F4097037D51712
ETag
"b92aa14ec379e156d2c79d43bc47328f"
Content-Type
text/javascript
X-UPSTREAM
52.219.72.48:443 hybrid3.golem.de
Cache-Control
max-age=600,s-maxage=60,public,stale-while-revalidate=2880000
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
52651
x-amz-id-2
NjaEvpAhN/HGdDDMiuYMFHihAdVCo03wB4sX9dbarPvzQ7Fo0l9bgALtxrELJhLR4SBFd8BgIKI=
gpt.js
www.googletagservices.com/tag/js/
23 KB
9 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: iqdtms.golem.de
URL: https://iqdtms.golem.de/cdn_golem_dt/live/iqadcontroller.js.gz
Protocol
SPDY
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
f6041669274cec9ad6f058faa18e3878c21a53c94a7d2e5541be2b9cb4edfccf
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
Mon, 15 Oct 2018 11:21:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"8 / 749 of 1000 / last-modified: 1539397219"
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
8594
x-xss-protection
1; mode=block
expires
Mon, 15 Oct 2018 11:21:38 GMT
imgad
tpc.googlesyndication.com/pagead/
25 B
412 B
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDTj9fOKBABGAEoATIIXhWOvj-krslA_KSrtwU
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
eebd6f2e5a80bb5d11966fd2446842888fcefdc5b18a36a619aa6fa0756e9376
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
Tue, 09 Oct 2018 10:32:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
age
521365
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
application/x-javascript; charset=UTF-8
status
200
cache-control
public, max-age=604800
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
45
x-xss-protection
1; mode=block
expires
Tue, 16 Oct 2018 10:32:13 GMT
yield.js
z.moatads.com/iqdigitaldfpprebidheader645711382528/
93 KB
28 KB
Script
General
Full URL
https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
ade647cbdadc97e5b51be05d1a4d158981dd24ead69e64ac2a3af095c85bc9aa

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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Wed, 10 Oct 2018 20:34:47 GMT
Server
AmazonS3
x-amz-request-id
01636AAC5F8969FF
ETag
"72ec5a0b2deffe9547d6fa0fea822db5"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=57429
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
28487
x-amz-id-2
90NLv5cyUQBepF2t6AMwDtDauK5tuf6qk0dmk8AREHkdSMIFFIp8SjJ5wZWFk1nF4QToUySsO9c=
prebid29082018.js
dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/
101 KB
31 KB
Script
General
Full URL
https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200d:de00:1:9777:c740:21 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
d77b6c18c0744a7ad3e394c6de665cfec35053d2ccc2e3d31aaece762cf6bbfd

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
Mon, 03 Sep 2018 07:57:51 GMT
content-encoding
gzip
last-modified
Wed, 29 Aug 2018 17:33:59 GMT
server
AmazonS3
age
1596391
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-id
ZZBxik7rRtzf0TPaZ3QnWO1JduB4GK14S_Ed7snt8egMYwtkcYaWaA==
via
1.1 4446e317b7b7532307c7755d43835bff.cloudfront.net (CloudFront)
apstag.js
c.amazon-adsystem.com/aax2/
63 KB
19 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.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
143.204.96.211 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-96-211.fra50.r.cloudfront.net
Software
Server /
Resource Hash
58b2814e612da4147df41cbfae3a68267f8692c4ef03237a924f03fe3c1c4a74

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, 14 Oct 2018 16:36:13 GMT
Content-Encoding
gzip
Server
Server
Age
67524
ETag
b1183c8ed0badbddf133c07543967656
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 32e4d419823b7f8df8417a8b18c9602d.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
Connection
keep-alive
Accept-Ranges
bytes
X-Amz-Cf-Id
2KLQHSBlTFGjs06lfkZ0Z-XYSAJiGved2Ptg1_bUhODWM8hPxsNZFw==
default.js
ups.xplosion.de/loader/97578/
Redirect Chain
  • https://dyn.emetriq.de/loader/97578/default.js
  • https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
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.212.18.79 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-212-18-79.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
45661a3e6863d0c77529828a7bd5bc802d65fb7dbce6d7fde4df6d05f3394954

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
Mon, 15 Oct 2018 11:21:38 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
1544

Redirect headers

Location
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Date
Mon, 15 Oct 2018 11:21:38 GMT
Server
Apache-Coyote/1.1
Connection
keep-alive
Content-Length
0
launch-EN92e1075482f3410d81944270acba8d90.min.js
assets.adobedtm.com/
123 KB
39 KB
Script
General
Full URL
https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.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
2.18.232.23 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-23.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
198841347aa586b5f41f72e80e280f540ef3d2574ae2e3ea065274be8d2e10a7

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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Mon, 08 Oct 2018 09:02:58 GMT
Server
Apache
ETag
"2a98aa461b018e566cf3bdc58d472d7a:1538989378"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*, *
Content-Length
39028
Expires
Mon, 15 Oct 2018 12:21:38 GMT
adex.js
dmp.theadex.com/d/494/1428/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/494/1428/s/adex.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
89.163.159.117 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
046a037b70269d7d556fcf44f52bae9aeb1f1e0b19d99db8092234582caf5944

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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Sun, 09 Sep 2018 18:54:04 GMT
Server
nginx
ETag
W/"5b956c4c-9b6f"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=300
Access-Control-Allow-Credentials
true
Connection
keep-alive
Expires
Mon, 15 Oct 2018 11:26:38 GMT
vis.js
d1pywvbolq0b04.cloudfront.net/iqdvis/golem/
1 KB
835 B
Script
General
Full URL
https://d1pywvbolq0b04.cloudfront.net/iqdvis/golem/vis.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200d:3200:1c:9fd1:6d00:21 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
20b5e1cd06d35ba81cd1742266d3e180f3a2f14f4d775831ff412cd1c4b38fdc

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, 04 Oct 2018 09:23:44 GMT
content-encoding
gzip
last-modified
Thu, 04 Oct 2018 09:18:53 GMT
x-amz-meta-expires
Thu, 01 Nov 2018 17:00:00 GMT
age
957475
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/javascript
status
200
x-amz-meta-contenttype
text/javascript
x-amz-cf-id
ubioZ5XEnxzFnyWU-lghgjsfqIa8qnM92GQJdFOiI9C71hcbN0wwJg==
via
1.1 96c175ce63da79b249fc4597809077cc.cloudfront.net (CloudFront)
server
AmazonS3
expires
Thu, 01 Nov 2018 17:00:00 GMT
26033,26034,26035,660053,660071,660107,660089,5108423,6378523,464839
ad.yieldlab.net/yp/
154 B
807 B
Script
General
Full URL
https://ad.yieldlab.net/yp/26033,26034,26035,660053,660071,660107,660089,5108423,6378523,464839?ts=1539602498623&yl_rtb_pubkey=21719_golem
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
2.18.232.233 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8

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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Content-Language
de-DE
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
Content-Type
text/javascript;charset=UTF-8
Content-Length
123
Expires
Sun, 14 Oct 2018 11:21:38 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
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Thu, 15 Nov 2018 11:21:38 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
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Thu, 15 Nov 2018 11:21:38 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
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Thu, 15 Nov 2018 11:21:38 GMT
truncated
/
258 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

Request headers

Response headers

Access-Control-Allow-Origin
*
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
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
Mon, 15 Oct 2018 11:21:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Thu, 15 Nov 2018 11:21:38 GMT
integrator.js
adservice.google.de/adsid/
109 B
171 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:819::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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/
109 B
171 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81c::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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
pubads_impl_264.js
securepubads.g.doubleclick.net/gpt/
184 KB
63 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
95e4236cf00268f59ec1287e0823e4fedb466ff7f708b102536fffdda40b9d4c
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
Mon, 15 Oct 2018 11:21:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 08 Oct 2018 14:47:44 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="44,43,39,35"
content-length
63858
x-xss-protection
1; mode=block
expires
Mon, 15 Oct 2018 11:21:38 GMT
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.96.211 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-96-211.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

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
Thu, 11 Oct 2018 16:32:32 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin
Age
67737
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Fri, 24 Aug 2018 07:13:51 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET
Content-Type
application/javascript
Via
1.1 a1098f0eeab192209962e3a9d76d0339.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
X-Amz-Cf-Id
XPtoUtSinLnSF8BLcB--TH6hh3uqqnivIDgae9sl9tIuCgu7GZst5Q==
bid
aax.amazon-adsystem.com/e/dtb/
47 B
341 B
XHR
General
Full URL
https://aax.amazon-adsystem.com/e/dtb/bid?src=3711&u=https%3A%2F%2Fwww.golem.de%2F&pid=3549130455261539602498848&cb=2661150535931539602498853&ws=1600x1200&v=7.18.00&t=2000&slots=%5B%7B%22sd%22%3A%22iqadtile1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile1%22%7D%2C%7B%22sd%22%3A%22iqadtile16%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22728x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile16%22%7D%2C%7B%22sd%22%3A%22iqadtile3%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile3%22%7D%2C%7B%22sd%22%3A%22iqadtile4%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%2C%22970x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile4%22%7D%2C%7B%22sd%22%3A%22iqadtile5%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%2C%22970x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile5%22%7D%2C%7B%22sd%22%3A%22iqadtile8%22%2C%22s%22%3A%5B%22300x300%22%2C%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile8%22%7D%2C%7B%22sd%22%3A%22iqadtile9%22%2C%22s%22%3A%5B%22300x300%22%2C%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile9%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.216.48 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
20c380a6ec53985b6410d58f337e9de1058d698cc487296d7369a714443b861b

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
Mon, 15 Oct 2018 11:21:39 GMT
Server
Server
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
47
id
dpm.demdex.net/
1 KB
1 KB
XHR
General
Full URL
https://dpm.demdex.net/id?d_visid_ver=3.3.0&d_fieldgroup=MC&d_rtbd=json&d_ver=2&d_orgid=41833DF75A550B4B0A495DA6%40AdobeOrg&d_nsid=0&ts=1539602498880
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.133.167 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-133-167.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
8cf8808ef1646523c63bc3dab8c5a3ca9daa9c1fade671f2811aa225611b68d4

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

DCS
dcs-prod-irl1-v006-0d913a573.edge-irl1.demdex.com 5.41.0.20181011114220 4ms
Pragma
no-cache
Content-Encoding
gzip
X-TID
0czLlZrySUk=
Vary
Origin, Accept-Encoding, User-Agent
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=utf-8
Content-Length
536
Expires
Thu, 01 Jan 1970 00:00:00 GMT
EXfba6992d417c4e169fbd5c6ebd3dc7a3-libraryCode_source.min.js
assets.adobedtm.com/BL4e1071613a0c4a16aafa097933a3e57c/
105 KB
28 KB
Script
General
Full URL
https://assets.adobedtm.com/BL4e1071613a0c4a16aafa097933a3e57c/EXfba6992d417c4e169fbd5c6ebd3dc7a3-libraryCode_source.min.js
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.23 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-23.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
877a62aadf35c3d4c3b6f875e0caedcd0471f95760ea3b1431ed990c17f7f93a

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
Mon, 15 Oct 2018 11:21:38 GMT
Content-Encoding
gzip
Last-Modified
Mon, 08 Oct 2018 09:02:58 GMT
Server
Apache
ETag
"45eb83d5b0dcf4490b9a7c25f054d2a9:1538989378"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*, *
Content-Length
28019
Expires
Mon, 15 Oct 2018 12:21:38 GMT
truncated
/
153 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31

Request headers

Response headers

Access-Control-Allow-Origin
*
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

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
126 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
768 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5

Request headers

Response headers

Access-Control-Allow-Origin
*
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: z.moatads.com
URL: https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.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
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CvVersion%7C3.3.0
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
Mon, 15 Oct 2018 11:21:39 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Thu, 15 Nov 2018 11:21:39 GMT
yi.js
mb.moatads.com/
2 KB
2 KB
Script
General
Full URL
https://mb.moatads.com/yi.js?ud=undefined&qn=(%2BIb%7Cj8o%3FJ(jkkeL07ta_*JRM!6t9B%2CN%3Ey)%2ChXbvU37_*NhSfBghz%5D*vOJ%23_%3DNoUA%5DRgBU_Gr1%3E%3AHuFTn%3ADXqJHZ%3BR%23yAb%2Bho8bYLaXBjA%3AmQ)%3CF!tAbjrzJ%3BgoVYGVxc%40lQQV%23tc3%2Fh%7C%3FVKV%3BW5.NO)Wx%7C*E%24%3D!L2ux%7Ci_lOfxECSR23_hFAkD%3Dv%3CN%5B.%22%24b_o%3FtVD%5D%5BpN%7CQF%40Sy7%7BA&qp=00000&is=voqBBkBBBBHhBBwBBZkJjBRCqUCY3CTCB6BXwUcu8gKCBS9lYBBBCCBpYFmR4BOZBBgSJTcBBBBBBBBHUoKOFCyz7BB3CZ6mv5TimBBe9oeCt9lXqBvBCfBBBBBBBBBBBBBBCBMBaBeBBkKzQClBeaKaMVMBj5iMPzyHVY9zqxknZlysGxCBcBBBC9CctORpnICyRBBB4OBBBBBBBBBBC9TiFF3dOKBCBBxBBBBBBBfBz1BD7fB3BpkBJUDyDCZ6IDDDCCCCDDCCCCCCCBdh2eBBBGI79kNB8DJoDBBBBCiBBiB&iv=6&qt=0&gz=0&hh=0&hn=0&tw=null&qc=0&qd=0&qf=1600&qe=1200&qh=1600&qg=1200&qm=0&qa=1600&qb=1200&qi=1600&qj=1200&qr=0&url=https%3A%2F%2Fwww.golem.de%2F&confidence=2&pcode=iqdigitaldfpprebidheader645711382528&callback=MoatNadoAllJsonpRequest_74731494
Requested by
Host: z.moatads.com
URL: https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.56.194.133 London, United Kingdom, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-56-194-133.eu-west-2.compute.amazonaws.com
Software
nginx/1.7.9 /
Resource Hash
e668501a20dabf5bc0f740d59041e9b18983fbcad8a99dc1a1ee360f545c779d

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
Mon, 15 Oct 2018 11:21:39 GMT
Server
nginx/1.7.9
Etag
"b1ca1583df2be5f1e45cde73253eb235f27f6566"
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=900
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
1688
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=17&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&na=2002807461&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Mon, 15 Oct 2018 11:21:39 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Mon, 15 Oct 2018 11:21:39 GMT
918034,918035,918036,918038,918037,918039,918040,5196623,918310
ad.yieldlab.net/yp/
154 B
807 B
Script
General
Full URL
https://ad.yieldlab.net/yp/918034,918035,918036,918038,918037,918039,918040,5196623,918310?ts=1539602498623&yl_rtb_pubkey=781119_golem
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
2.18.232.233 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8

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
Mon, 15 Oct 2018 11:21:39 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Content-Language
de-DE
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
Content-Type
text/javascript;charset=UTF-8
Content-Length
123
Expires
Sun, 14 Oct 2018 11:21:39 GMT
Cookie set dest5.html
iqdigital.demdex.net/ Frame 8103
0
0
Document
General
Full URL
https://iqdigital.demdex.net/dest5.html?d_nsid=0
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.86.186 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-86-186.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash

Request headers

Host
iqdigital.demdex.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
Cookie
demdex=10813531654945682143188154401728892417
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

Accept-Ranges
bytes
Cache-Control
max-age=21600
Content-Encoding
gzip
Content-Type
text/html
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Last-Modified
Thu, 11 Oct 2018 15:08:54 GMT
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Pragma
no-cache
Set-Cookie
demdex=10813531654945682143188154401728892417;Path=/;Domain=.demdex.net;Expires=Sat, 13-Apr-2019 11:21:39 GMT;Max-Age=15552000
Vary
Accept-Encoding, User-Agent
X-TID
bwRMORP4Ru8=
Content-Length
2766
Connection
keep-alive
ibs:dpid=411&dpuuid=W8R4QwAACfgg9RKk
dpm.demdex.net/
Redirect Chain
  • https://cm.everesttech.net/cm/dd?d_uuid=10813531654945682143188154401728892417
  • https://dpm.demdex.net/ibs:dpid=411&dpuuid=W8R4QwAACfgg9RKk
42 B
769 B
Image
General
Full URL
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W8R4QwAACfgg9RKk
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.246.133.167 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-133-167.eu-west-1.compute.amazonaws.com
Software
/
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

DCS
dcs-prod-irl1-v006-0c913c0fa.edge-irl1.demdex.com 5.41.0.20181011114220 5ms
Pragma
no-cache
X-TID
OeVVWpo5QG0=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

Date
Mon, 15 Oct 2018 11:21:38 GMT
Server
AMO-cookiemap/1.1
P3P
CP="NOI NID DEVa PSAa PSDa OUR IND PUR COM NAV INT DEM"
Location
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W8R4QwAACfgg9RKk
Cache-Control
no-cache
Connection
Keep-Alive
Keep-Alive
timeout=15,max=100
Content-Length
0
prebid
ib.adnxs.com/ut/v3/
21 B
712 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.220 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

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
Mon, 15 Oct 2018 11:21:41 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 309.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.222.245:80
AN-X-Request-Uuid
45f316a4-d61b-4fe5-bcd6-878ad5faf3ac
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
cdb
bidder.criteo.com/
0
186 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?profileId=207&av=11&wv=1.20.0&cb=82456433545
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
178.250.2.89 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
Finatra /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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

Access-Control-Allow-Origin
https://www.golem.de
Date
Mon, 15 Oct 2018 11:21:38 GMT
Access-Control-Allow-Credentials
true
Server
Finatra
Vary
Origin
p.min.js
cdn.emetriq.de/adp/profiling/0.1.13/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200d:a600:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f

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
Wed, 06 Sep 2017 22:08:45 GMT
content-encoding
gzip
last-modified
Tue, 11 Apr 2017 11:21:30 GMT
server
AmazonS3
age
28467443
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
FiFeAFfpoMZPPyU16IPZd0oUAvReA_Mm
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
8KP7HD7X4ezznpJeXgLZEzzG8pWY-L5N4X-BEHJex7le2ZNtvIq3ag==
via
1.1 f96185b1d69d6f85635bc2b5554da639.cloudfront.net (CloudFront)
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=0&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=0&zMoat_YI1=0&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=22472409&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Mon, 15 Oct 2018 11:21:39 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Mon, 15 Oct 2018 11:21:39 GMT
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&event_id=page_view&_sid=97578&_ver=0.1.13&_seg=jsonp&_=974473950918
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.212.18.79 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-212-18-79.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
18399409a85594ff2fae84d5bd21f911b6327e0b212405133bd58754f4f5e27c

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
Mon, 15 Oct 2018 11:21:39 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
1500
ads
securepubads.g.doubleclick.net/gampad/
22 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C728x90&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile1%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D1%26m_mv%3D80%2C70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499492&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=0&adk=242336818&gut=v2&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=47&icsg=42949715968&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x-1&msz=1000x-1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
9633c400a446273656ca565e55de70519ce5d3c9834f02ac17117d1504affc63
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
Mon, 15 Oct 2018 11:21:39 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
6356
x-xss-protection
1; mode=block
google-lineitem-id
4775329615
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138242228674
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_264.js
securepubads.g.doubleclick.net/gpt/
75 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
69f010ce6969b6ef9a337ee45c7d1b35fe5b6e83e10a1f035f166c1ad1f1e7b2
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
Mon, 15 Oct 2018 11:21:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 08 Oct 2018 14:47:44 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="44,43,39,35"
content-length
27712
x-xss-protection
1; mode=block
expires
Mon, 15 Oct 2018 11:21:39 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::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

expires
Wed, 02 Oct 2019 10:29:16 GMT
cache-control
public, immutable, max-age=31536000
last-modified
Mon, 11 Jun 2018 14:38:59 GMT
content-type
text/html
ads
securepubads.g.doubleclick.net/gampad/
22 KB
6 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x250%7C1000x100%7C970x90%7C940x250%7C970x250%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile3%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D3%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499550&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=2638043459&gut=v2&ifi=2&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=2241972971520&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x10651&msz=99x1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
f2a3ae0a2aade858fa2ebe1d687695e83c0a3012dfbbc786cd9f3104cd9a68d3
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
Mon, 15 Oct 2018 11:21:39 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
6353
x-xss-protection
1; mode=block
google-lineitem-id
4686089258
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138235188578
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
ads
securepubads.g.doubleclick.net/gampad/
26 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x167%7C1000x125%7C1000x100%7C970x250%7C800x250%7C970x90%7C728x90%7C660x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile16%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D16%26m_mv%3DslotNoSlotData%26m_gv%3DslotNoSlotData&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499608&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3736976088&gut=v2&ifi=3&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=49&icsg=2241972971520&std=0&csl=81&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=99x1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
3661be8761631375ba3857628a44911f9f87bccede66684a59c075307a2112c8
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
Mon, 15 Oct 2018 11:21:39 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
7134
x-xss-protection
1; mode=block
google-lineitem-id
4643517062
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138234541632
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
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=44&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1007636441&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Mon, 15 Oct 2018 11:21:39 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Mon, 15 Oct 2018 11:21:39 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
74 KB
28 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
bd3584b1408380e4f3cfbcf229de40a5df42982b192159b9145757a5d269eadf
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
Mon, 15 Oct 2018 11:21:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27982
x-xss-protection
1; mode=block
server
cafe
etag
7176381857693900459
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 15 Oct 2018 11:21:39 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0
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
Mon, 15 Oct 2018 11:21:39 GMT
Content-Encoding
gzip
Last-Modified
Wed, 15 Aug 2018 21:00:18 GMT
Server
nginx
ETag
W/"5b749462-7ff"
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
Thu, 15 Nov 2018 11:21:39 GMT
gx-ads.js
ads.golem.de/track.ads/
124 B
492 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=1051196867541628&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
54a5c9011a4eec01cb0af8620d0ce3dd3bba04b167b7f674b074428eeb06e020

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0
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
Mon, 15 Oct 2018 11:21:39 GMT
Last-Modified
Tue, 12 Jan 2016 21:49:10 GMT
Server
nginx
ETag
"569574d6-7c"
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
124
Expires
Thu, 15 Nov 2018 11:21:39 GMT
ads
securepubads.g.doubleclick.net/gampad/
23 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile8%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D8%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499775&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=993&ady=840&adk=1289509276&gut=v2&ifi=4&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=60&icsg=2825744894395376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x344&msz=99x1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
f63aa01039149e3d1de90c4a01f612fc78cdf6b6e774993f0359d106ac58f7be
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
Mon, 15 Oct 2018 11:21:40 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
6686
x-xss-protection
1; mode=block
google-lineitem-id
4550221103
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
85376452645
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
ads
securepubads.g.doubleclick.net/gampad/
22 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x500%7C1000x333%7C1000x250%7C1000x167%7C1000x125%7C1000x100%7C970x90%7C800x250%7C970x250%7C970x90%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile4%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D4%26m_mv%3D60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499824&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=1193&adk=780685045&gut=v2&ifi=5&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=60&icsg=2825744894395376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x16&msz=99x1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
5a3deef5e530b64438564db35cae5c43ff61b20216e1d8fea6986f30daeb7b20
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
Mon, 15 Oct 2018 11:21:40 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
6384
x-xss-protection
1; mode=block
google-lineitem-id
4686089258
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138235188476
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
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
52.212.57.107 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-212-57-107.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
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, 14 Oct 2018 07:22:56 GMT
Content-Encoding
gzip
Last-Modified
Sun, 14 Oct 2018 07:22:41 GMT
Server
akka-http/10.1.3
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
m
p.yieldlab.net/
0
336 B
Image
General
Full URL
https://p.yieldlab.net/m?dm_id=21719&ext_id=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr&ddata_seg=e0
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
85.114.144.197 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
lb.yieldlab.net
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
Mon, 15 Oct 2018 11:21:39 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 14 Oct 2018 11:21:39 GMT
2.gif
xpl.theadex.com/d/327/i/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1001618631321390153&axd_pid=22&axd_fuid=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr
43 B
717 B
Image
General
Full URL
https://xpl.theadex.com/d/327/i/2.gif?_sc=1001618631321390153&axd_pid=22&axd_fuid=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr
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
89.163.159.109 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 15 Oct 2018 11:21:40 GMT
Server
nginx
P3P
CP="CAO PSA OUR"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Transfer-Encoding
binary
Connection
keep-alive
Access-Control-Allow-Credentials
true
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Date
Mon, 15 Oct 2018 11:21:39 GMT
Server
nginx
Transfer-Encoding
chunked
P3P
CP="CAO PSA OUR"
Location
https://xpl.theadex.com:443/d/327/i/2.gif?_sc=1001618631321390153&axd_pid=22&axd_fuid=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=UTF-8
a.js
d.df-srv.de/match/
6 B
228 B
Image
General
Full URL
https://d.df-srv.de/match/a.js?pid=42
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
2001:16e0:10a:1::c2:1 , Germany, ASN12611 (RKOM R-KOM Regensburger Telekommunikations GmbH & Co. KG, DE),
Reverse DNS
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
Mon, 15 Oct 2018 11:21:20 GMT
Last-Modified
Mon, 29 May 2017 14:11:22 GMT
Server
nginx
ETag
"592c2c0a-6"
Content-Type
text/html
Connection
close
Accept-Ranges
bytes
Content-Length
6
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0&...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0&...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0&lt=1539602499878&ev=&cs=k53yq6&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.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.04.6 0028
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
Mon, 15 Oct 2018 11:21:40 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.04.6 0028
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Mon, 15 Oct 2018 11:21:39 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.04.6 0028
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Mon, 15 Oct 2018 11:21:39 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0&lt=1539602499878&ev=&cs=k53yq6&mo=1&sr=71
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sun, 15 Oct 2017 11:21:39 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
52 KB
17 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
104.248.100.80 Wilmington, United States, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
eddea379f08f5c8557f0606cc6df527ecaa380725d961ee04594b7611d38e191

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
Mon, 15 Oct 2018 11:21:39 GMT
Content-Encoding
gzip
Last-Modified
Fri, 28 Sep 2018 10:46:20 GMT
Server
nginx/1.14.0 (Ubuntu)
ETag
W/"5bae067c-cfca"
Transfer-Encoding
chunked
X-Hostname
cdn-eu-18
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Tue, 16 Oct 2018 10:47: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
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::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
Mon, 01 Oct 2018 17:56:18 GMT
server
Golfe2
age
3119
date
Mon, 15 Oct 2018 10:29:40 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="44,43,39,35"
content-length
17168
expires
Mon, 15 Oct 2018 12:29:40 GMT
RC06273f0c936b473482bd76df6eaba8a7-source.min.js
assets.adobedtm.com/BL4e1071613a0c4a16aafa097933a3e57c/
578 B
833 B
Script
General
Full URL
https://assets.adobedtm.com/BL4e1071613a0c4a16aafa097933a3e57c/RC06273f0c936b473482bd76df6eaba8a7-source.min.js
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.23 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-23.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
c717c26c23927b42fdeea4a25e96d181c272e685f67b4422626ac49488c5fae9

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
Mon, 15 Oct 2018 11:21:39 GMT
Content-Encoding
gzip
Last-Modified
Mon, 08 Oct 2018 09:02:58 GMT
Server
Apache
ETag
"88277a3529dc7b0265fc1b7c1b8b7f42:1538989378"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*, *
Content-Length
391
Expires
Mon, 15 Oct 2018 12:21:39 GMT
s56655356883531
iqdigitalmediamarketinggmbh.sc.omtrdc.net/b/ss/iqdmmgglobalprod/10/JS-v.2.9.0.6.2-L8UK/
899 B
2 KB
Script
General
Full URL
https://iqdigitalmediamarketinggmbh.sc.omtrdc.net/b/ss/iqdmmgglobalprod/10/JS-v.2.9.0.6.2-L8UK/s56655356883531?AQB=1&ndh=1&pf=1&callback=s_c_il[1].doPostbacks&et=1&t=15%2F9%2F2018%2011%3A21%3A39%201%200&d.&nsid=0&jsonv=1&.d&mid=11426032157103850683234836750593996987&aamlh=6&ce=UTF-8&pageName=%2F&g=https%3A%2F%2Fwww.golem.de%2F&cc=EUR&ch=D%3Dv8&server=D%3Dv3&events=event1%2Cevent2&aamb=6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y&c1=D%3Dv2&v1=D%3DpageName&c2=D%3Dv3&v2=https%3A%2F%2Fwww.golem.de%2F&v3=www.golem.de&c6=D%3Dv7&c7=D%3Dv8&v7=homepage&v8=homepage&c10=D%3Dv11&v11=non-HUB&c27=D%3Dv28&c28=D%3Dv29&v28=First%20page%20view%20or%20cookies%20not%20supported&c29=D%3Dv30&v29=15.10.2018-11%3A21&v30=1539602499901&c32=D%3Dv33&c33=D%3Dv34&v33=default&v34=%2F&c40=www&c44=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20microsoft%2C%20netscape%2C%20browser%2C%20daily%2C%20headline%2C%20business%2C%20top%2C%20newslink%2C%20newslinks%2C%20stories%2C%20software%2C%20press%20release%2C%20Pressemitteilungen%2C%20Schlagzeilen%2C%20Nachrichten%2C%20deutsch%2C%20neu%2C%20aktuell%2C%20online%2C%20www%2C%20today%2C%20todays%2C%20up-to-date%20news%2C%20fast%20news%2C%20intranet%20news%2C%20world%2C%20international%2C%20german%2C%20financial%2C%20ipo%2C%20business&c45=D%3Dv45&v45=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaft%20%C3%BCber%20Hardware%2C%20Software%2C%20Telekommunikation%2C%20Games&c47=Default&c49=Default&c50=%2F&c51=11&c75=2018-10-08T09%3A02%3A47Z%7Cv.2.9.0.6.2&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&mcorgid=41833DF75A550B4B0A495DA6%40AdobeOrg&AQE=1
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/BL4e1071613a0c4a16aafa097933a3e57c/EXfba6992d417c4e169fbd5c6ebd3dc7a3-libraryCode_source.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
172.82.228.19 Lehi, United States, ASN15224 (OMNITURE - Adobe Systems Inc., US),
Reverse DNS
*.sc.omtrdc.net
Software
Omniture DC/2.0.0 /
Resource Hash
ad193e4bc2ded2978fe66af53cd54919a7512397ac5f470490689df7350a3b76
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

X-AAM-TID
+zgUFt8UR4o=
Date
Mon, 15 Oct 2018 11:21:40 GMT
X-Content-Type-Options
nosniff
X-C
ms-6.5.1
P3P
CP="This is not a P3P policy"
Connection
keep-alive
Content-Length
899
X-XSS-Protection
1; mode=block
DCS
dcs-prod-irl1-v006-0a499d7d0.edge-irl1.demdex.com 5.41.0.20181011114220 14ms
Pragma
no-cache
Last-Modified
Tue, 16 Oct 2018 11:21:40 GMT
Server
Omniture DC/2.0.0
xserver
www170
ETag
"3306271193257017344-5979163014811887585"
Vary
*
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, no-transform, private
Expires
Sun, 14 Oct 2018 11:21:40 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:39 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-113e8"
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
Thu, 15 Nov 2018 11:21:39 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-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
Thu, 15 Nov 2018 11:21:40 GMT
s42-snap.jpg
video.golem.de/teaser/1/1/21937/thumb-high-1000/
107 KB
108 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21937/thumb-high-1000/s42-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
3ed66de10872a55843f3e6127ad7eecebd55cec2be60110bdfc31c422ec81a1a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Thu, 11 Oct 2018 08:07:46 GMT
Server
nginx
ETag
"5bbf04d2-1adf8"
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
110072
Expires
Thu, 15 Nov 2018 11:21:40 GMT
parcour-snap.jpg
video.golem.de/teaser/1/1/21941/thumb-high-1000/
130 KB
131 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21941/thumb-high-1000/parcour-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
64a2022c34b7a10cc67930bfc0efb05ebfa45177bdf6ffb2d61cf2afe8f2e8d4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 09:52:56 GMT
Server
nginx
ETag
"5bc06ef8-2098e"
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
133518
Expires
Thu, 15 Nov 2018 11:21:40 GMT
athlon-snap.jpg
video.golem.de/teaser/1/1/21927/thumb-high-1000/
94 KB
94 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21927/thumb-high-1000/athlon-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
ad0a38b4c9b7800b01a4b29d1de6ed220fea5842b8f3c00212842521344f7a4b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Tue, 09 Oct 2018 08:04:11 GMT
Server
nginx
ETag
"5bbc60fb-1780c"
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
96268
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137109-176425-176424_rc.jpg
www.golem.de/1810/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1810/137109-176425-176424_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
7b2fcaffe75c5ab284aac9f968e17afd464b727906072f5c0fc2770ac5a5649c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 15 Oct 2018 08:16:05 GMT
Server
nginx
ETag
"5bc44cc5-241e"
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
9246
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137094-176356-176353_rc.jpg
www.golem.de/1810/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1810/137094-176356-176353_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
1e5f7ba50ebbf1e14eaee59f36c04b1afdde21ba4719fc729358d192d45926a6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 15 Oct 2018 07:02:05 GMT
Server
nginx
ETag
"5bc43b6d-20a5"
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
8357
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137108-176420-176417_rc.jpg
www.golem.de/1810/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1810/137108-176420-176417_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
be129a732f0bc1f5d65549965eb26714382c9c57997d55e083a99ea9b3e257cb

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 15 Oct 2018 07:20:05 GMT
Server
nginx
ETag
"5bc43fa5-23b4"
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
9140
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137100-176386-176385_rc.jpg
www.golem.de/1810/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1810/137100-176386-176385_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
1432a44ccb889e96b316ba9a1145fc9c7af7b5743a5dcc7cc70b43d5ba4008d3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sun, 14 Oct 2018 09:41:04 GMT
Server
nginx
ETag
"5bc30f30-19c6"
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
6598
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137076-176264-176261_rc.jpg
www.golem.de/1810/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1810/137076-176264-176261_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
86aa8ea778d1af5e74eb94ab8afcac373bd0702a313c826ffcf53f25c1a9f645

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 07:23:04 GMT
Server
nginx
ETag
"5bc04bd8-1abb"
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
6843
Expires
Thu, 15 Nov 2018 11:21:40 GMT
135633-172257-172254_rc.jpg
www.golem.de/1810/
68 KB
69 KB
Image
General
Full URL
https://www.golem.de/1810/135633-172257-172254_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
cfa8e5dcda33c97a0909f42e9e418163a67d030c6c650b6bdc3080a06578c757

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 08 Oct 2018 10:04:05 GMT
Server
nginx
ETag
"5bbb2b95-11107"
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
69895
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137106-176416-176413_rc.jpg
www.golem.de/1810/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1810/137106-176416-176413_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
d9a293add5cfd10491411e829d2e38b48264dff08db1b7b275bad833e98ba500

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 15 Oct 2018 06:00:04 GMT
Server
nginx
ETag
"5bc42ce4-1542"
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
5442
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137083-176305-176302_rc.jpg
www.golem.de/1810/
12 KB
13 KB
Image
General
Full URL
https://www.golem.de/1810/137083-176305-176302_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
0dd2f64205bc74bab5d9ea2c30512d3d6f98b37aa22dd9ce39584ae952032829

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 08:51:04 GMT
Server
nginx
ETag
"5bc06078-30fd"
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
12541
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137105-176412-176409_rc.jpg
www.golem.de/1810/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1810/137105-176412-176409_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
75e55a1492e4994ddf20aac7091cdad173492ca825d19b54cd9c871ddae2b069

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 15 Oct 2018 05:31:03 GMT
Server
nginx
ETag
"5bc42617-179f"
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
6047
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137104-176408-176405_rc.jpg
www.golem.de/1810/
3 KB
4 KB
Image
General
Full URL
https://www.golem.de/1810/137104-176408-176405_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
e97143383a48b39eb42ccb6641efa01e33979e3dbc0390b69d1892ce62787688

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 15 Oct 2018 05:15:03 GMT
Server
nginx
ETag
"5bc42257-d79"
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
3449
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137103-176404-176401_rc.jpg
www.golem.de/1810/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1810/137103-176404-176401_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
fb15ac1b2757dbec372ceae76808222992021e044be0a498f9a2398aa197dff4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sun, 14 Oct 2018 11:06:04 GMT
Server
nginx
ETag
"5bc3231c-263e"
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
9790
Expires
Thu, 15 Nov 2018 11:21:40 GMT
136849-175127-175124_rc.jpg
www.golem.de/1810/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1810/136849-175127-175124_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
7eb89a8170e16676f644e05898b986be5f3eb185a9edce74ab383ec74b753974

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 10:04:06 GMT
Server
nginx
ETag
"5bc07196-1fb9"
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
8121
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137102-176400-176397_rc.jpg
www.golem.de/1810/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1810/137102-176400-176397_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
51187cf01d85f0c915738349bae225b59355553655ec227a638b4415bd25b1ad

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sun, 14 Oct 2018 10:18:05 GMT
Server
nginx
ETag
"5bc317dd-1b51"
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
6993
Expires
Thu, 15 Nov 2018 11:21:40 GMT
136966-175698-175695_rc.jpg
www.golem.de/1810/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1810/136966-175698-175695_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
e6f7ef4bae883c5f899f7a5c88f061afb2c40b35213e4124bfc6749be3150d50

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 05:00:04 GMT
Server
nginx
ETag
"5bc02a54-13a6"
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
5030
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137101-176390-176387_rc.jpg
www.golem.de/1810/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1810/137101-176390-176387_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
1df2793d0c81d2642c32cd1dd0655a8539f265ae7da0a6b1ee0c6f20e79a2cc5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sun, 14 Oct 2018 09:14:04 GMT
Server
nginx
ETag
"5bc308dc-23de"
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
9182
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137099-176384-176381_rc.jpg
www.golem.de/1810/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1810/137099-176384-176381_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
0e579d4dbc20169eccce332c687705574c084b63b3ca149482f5bca22fc8f051

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sat, 13 Oct 2018 12:00:04 GMT
Server
nginx
ETag
"5bc1de44-1a33"
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
6707
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137096-176364-176363_rc.jpg
www.golem.de/1810/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1810/137096-176364-176363_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
92fe406f0a0efbe09ac10f4f4bba4819d0932a5881035623ce7fc463622b1b91

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sat, 13 Oct 2018 11:15:04 GMT
Server
nginx
ETag
"5bc1d3b8-1824"
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
6180
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137098-176380-176377_rc.jpg
www.golem.de/1810/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1810/137098-176380-176377_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
312230f329d2013ee52679a6e90e34a808400553786003d3baa78f66cbc6048d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sat, 13 Oct 2018 10:19:04 GMT
Server
nginx
ETag
"5bc1c698-1d85"
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
7557
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137097-176375-176372_rc.jpg
www.golem.de/1810/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1810/137097-176375-176372_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
9c741867cf113f7d2ca9c80a2ce1c27504b85cc69604c009ff084e75aba312e7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sat, 13 Oct 2018 09:17:04 GMT
Server
nginx
ETag
"5bc1b810-20c9"
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
8393
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137086-176348-176347_rc.jpg
www.golem.de/1810/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1810/137086-176348-176347_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
4f14c38d61b8e73a60ac7da136f9187d1b2ceca4feaebc163ebe713ec53db556

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Sat, 13 Oct 2018 07:02:04 GMT
Server
nginx
ETag
"5bc1986c-15ad"
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
5549
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137095-176370-176365_rc.jpg
www.golem.de/1810/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1810/137095-176370-176365_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
0ea37f7f6f24c90816d4f28bdc3aad180d345b868c68a48bb299b925b166218b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 15:19:04 GMT
Server
nginx
ETag
"5bc0bb68-1830"
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
6192
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137093-176345-176342_rc.jpg
www.golem.de/1810/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1810/137093-176345-176342_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
5ec22c032553124e39ba1e3d1b29109d98994eae906bd44525f687869bd34268

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 13:02:04 GMT
Server
nginx
ETag
"5bc09b4c-25bb"
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
9659
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137092-176335-176332_rc.jpg
www.golem.de/1810/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1810/137092-176335-176332_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
c5b32c5631f62f6b07f11aa150fb545e1b7887bb6e82464401794854ea7e6e2d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 12:22:05 GMT
Server
nginx
ETag
"5bc091ed-1c93"
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
7315
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137090-176341-176336_rc.jpg
www.golem.de/1810/
4 KB
5 KB
Image
General
Full URL
https://www.golem.de/1810/137090-176341-176336_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
05e78ff4e2786f3ef8952d319c8cb9657cf19e4767a75815ffae9a9161d7635b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 12:40:05 GMT
Server
nginx
ETag
"5bc09625-1112"
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
4370
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137089-176319-176316_rc.jpg
www.golem.de/1810/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1810/137089-176319-176316_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
04d73bd4b01e31323606e2dd5751e2d084346ba3b8b37b64d248382e557443b0

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 10:18:03 GMT
Server
nginx
ETag
"5bc074db-1508"
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
5384
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137088-176327-176320_rc.jpg
www.golem.de/1810/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1810/137088-176327-176320_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
712de2c0d71111464584bfc05bc5c14fbbd0950bcbf0aa9422910d1614219c81

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 09:52:05 GMT
Server
nginx
ETag
"5bc06ec5-1bda"
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
7130
Expires
Thu, 15 Nov 2018 11:21:40 GMT
137087-176315-176312_rc.jpg
www.golem.de/1810/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1810/137087-176315-176312_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
1dbf1a79ef158a348b22d885ae4140e415a53b4eccdd78597724e5225c315585

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 12 Oct 2018 09:43:05 GMT
Server
nginx
ETag
"5bc06ca9-2384"
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
9092
Expires
Thu, 15 Nov 2018 11:21:40 GMT
133136-156931-i_rc.jpg
www.golem.de/1803/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1803/133136-156931-i_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
48e304e2056b22e5ad24dc55ca80a5b12ade12ea36bdc1a8e076f807185f0c3a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 05 Mar 2018 09:23:06 GMT
Server
nginx
ETag
"5a9d0c7a-2782"
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
10114
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136829-175839-175836_rc.jpg
www.golem.de/1810/
20 KB
21 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136829-175839-175836_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
5b497fdd4b287fa5dcea22bb695c3aa03a1587b48d4ea421c7ee2cb330622693

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Tue, 09 Oct 2018 10:02:06 GMT
Server
nginx
ETag
"5bbc7c9e-5111"
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
20753
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_137004-175995-175992_rc.jpg
www.golem.de/1810/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1810/sp_137004-175995-175992_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
317bfc347737695e008dddb81627fd396dfa90fa22110e7e0703282358e34bd6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Wed, 10 Oct 2018 08:00:05 GMT
Server
nginx
ETag
"5bbdb185-4709"
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
18185
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136948-175610-175608_rc.jpg
www.golem.de/1810/
26 KB
26 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136948-175610-175608_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
bb195b4fef43f516764b496131499351d9ec957a079dadd4479e75d58b0f65d4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 05 Oct 2018 11:00:07 GMT
Server
nginx
ETag
"5bb74437-6811"
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
26641
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_137020-175952-175950_rc.jpg
www.golem.de/1810/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1810/sp_137020-175952-175950_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
bab83b193535b10097ce431498e9bde3986f2dbc0fdc5799d9b3f28091f0151f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Tue, 09 Oct 2018 16:00:09 GMT
Server
nginx
ETag
"5bbcd089-5073"
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
20595
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_137024-176004-176002_rc.jpg
www.golem.de/1810/
22 KB
23 KB
Image
General
Full URL
https://www.golem.de/1810/sp_137024-176004-176002_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
796de1d485776ba39ec2fce23af8f5355d2f8d2ccf05330c02d2b9786a48dff1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Wed, 10 Oct 2018 10:07:07 GMT
Server
nginx
ETag
"5bbdcf4b-59c0"
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
22976
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136919-175443-175441_rc.jpg
www.golem.de/1810/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136919-175443-175441_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
156191433d18ae86b08296d93e8b87f6e6448fd6d80c4dfcb7033618fc9fd900

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 08 Oct 2018 06:51:04 GMT
Server
nginx
ETag
"5bbafe58-581f"
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
22559
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136995-175848-175846_rc.jpg
www.golem.de/1810/
23 KB
24 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136995-175848-175846_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
fa2250cbc458f307aa1dbaacc443c2adbb833ced7807b2af0e48d7ec1750ee5c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Tue, 09 Oct 2018 09:05:06 GMT
Server
nginx
ETag
"5bbc6f42-5d65"
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
23909
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136878-175347-175344_rc.jpg
www.golem.de/1810/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136878-175347-175344_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
35065d83d09b7e4a34ff968875619cf60eed78f4efaddba3ddabea07948b44cd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Tue, 02 Oct 2018 10:02:08 GMT
Server
nginx
ETag
"5bb34220-4691"
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
18065
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136844-175474-175472_rc.jpg
www.golem.de/1810/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136844-175474-175472_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
94902eefe10eb456ea93480b5432d59d8a2bcd6c1d72718b8011f204111c3923

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 05 Oct 2018 10:04:05 GMT
Server
nginx
ETag
"5bb73715-5791"
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
22417
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136880-175251-175249_rc.jpg
www.golem.de/1810/
25 KB
25 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136880-175251-175249_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
f533092b0aa60e3071e9d17e494d5b730277dbad1d3a9f71398c3519b4e39cb5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 01 Oct 2018 11:01:05 GMT
Server
nginx
ETag
"5bb1fe71-620e"
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
25102
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136543-173728-173726_rc.jpg
www.golem.de/1809/
28 KB
28 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136543-173728-173726_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
1f4984549a34e848abfda3ce130dc42ada0f60bf40b82e9089a1edb8d586c6ca

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 28 Sep 2018 10:03:06 GMT
Server
nginx
ETag
"5badfc5a-6e23"
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
28195
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136936-175648-175646_rc.jpg
www.golem.de/1810/
22 KB
23 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136936-175648-175646_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
05be491c95781e779006bcb1246f48bb68b330b55634916664eea33cf5fc7aa2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 05 Oct 2018 08:37:07 GMT
Server
nginx
ETag
"5bb722b3-5928"
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
22824
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136698-174403-174401_rc.jpg
www.golem.de/1810/
21 KB
22 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136698-174403-174401_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
6f1a751d715f8302303e21796078d0e1f703fde52f8edb3650ca615ec426d78e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Thu, 04 Oct 2018 10:02:05 GMT
Server
nginx
ETag
"5bb5e51d-55fc"
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
22012
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136892-175315-175313_rc.jpg
www.golem.de/1810/
26 KB
26 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136892-175315-175313_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
916add75e0a735944e7edb61b5fbd0b880050e17b0b849475e329891cb7d3399

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Thu, 04 Oct 2018 07:06:05 GMT
Server
nginx
ETag
"5bb5bbdd-67df"
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
26591
Expires
Thu, 15 Nov 2018 11:21:40 GMT
sp_136868-175224-175222_rc.jpg
www.golem.de/1810/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1810/sp_136868-175224-175222_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
4db0ec8cb8b9540643f5700716a271b7bed33189a9b4da3abdabb937d1a0fefd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=58bbec39b36cabc4:T=1539602499:S=ALNI_MZ2Az4PfrbYdaSozCwqTOJQe5R7kw
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 01 Oct 2018 10:01:06 GMT
Server
nginx
ETag
"5bb1f062-563e"
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
22078
Expires
Thu, 15 Nov 2018 11:21:40 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1539602500&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
2a00:13c8:f5::f:4b3d:182 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adb_dslv=1539602499906; s_cc=true; __gads=ID=a8365f12214dc62b:T=1539602499:S=ALNI_Mbei0U8LrrrwbUEN16Ofr5aEbuIOg
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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Mon, 15 Oct 2018 11:21:40 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
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/ Frame 80A3
74 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
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
Mon, 08 Oct 2018 13:12:18 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
598162
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27477
x-xss-protection
1; mode=block
server
cafe
etag
1272360511746383795
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 22 Oct 2018 13:12:18 GMT
imgad
pagead2.googlesyndication.com/pagead/
2 KB
3 KB
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/imgad?id=CICAgIDQ04jCzgEQARgBKAEyCLeTE4Yu5hvQQMa81o0F
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
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
Tue, 09 Oct 2018 10:31:22 GMT
x-content-type-options
nosniff
server
cafe
age
521418
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
image/png
status
200
cache-control
public, max-age=604800
content-disposition
attachment; filename="image.png"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
2437
x-xss-protection
1; mode=block
expires
Tue, 16 Oct 2018 10:31:22 GMT
osd.js
pagead2.googlesyndication.com/pagead/
73 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/osd.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
fdfc01efb2956b260c841eadb2948b85dda3184d9a933541e933e70ed188817a
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
Mon, 15 Oct 2018 10:29:15 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
3145
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27010
x-xss-protection
1; mode=block
server
cafe
etag
4497184731343855560
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=3600
timing-allow-origin
*
expires
Mon, 15 Oct 2018 11:29:15 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/ Frame 1338
74 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
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
Mon, 08 Oct 2018 13:12:18 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
598162
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27477
x-xss-protection
1; mode=block
server
cafe
etag
1272360511746383795
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 22 Oct 2018 13:12:18 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 80A3
0
72 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsusu7NzNuoISlMu3PhmFsfQ0Ri6zXZaZqtau36XeZxuRLk07L7Ga9wHxpRoxqNTNKPe-FKqvklRX1y3SBohJk15ms1tuTBQUK_yLE7DZOVi94D6Vhhsg6PBXG5v5rNrsdX4qg_qXgFqzUHncs-sjVqn0FGEXoubX67dwiFZ0c3iTO3DxzESLVPHM0DTgureqdlHZFZnFS8uVldeMu9Qov3ga7Q9HX-ZShuPG_xZ5KJdOjOWsNWFgqE4Uzc&sai=AMfl-YSELP1MI34cBNPkZNCxQI7rQTWGyywieSjEiwpb0P9FhNS-2p5zaWpsWLuNyiurFcYs3wK8d_5HbrF84BAsfIM7lKzjzzXRjb2FqoJuow&sig=Cg0ArKJSzIpNGHa8a-5VEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:40 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
view
securepubads.g.doubleclick.net/pcs/ Frame 1338
0
47 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstVISbanIGDw9woqTLVwI7k_PaQZkP53u9-JCEn7IAlGWsBX-4TBDnL10cn3Rle-ZbQXsL6-QaZmsbuK_vK5E2HjIOb26KlmIkqb2EKqxWn-gmaPfpJMpAROyDoCEAmqxGU4VeRHaJShJcei-CEcfG18iQfBaI0XgyiIkbUEs4eNL-wG4SqDB8y5N9JgEar3OTu29w0PQqP8wxBSE2-F8fA0oJ1hwrn61cqW1WCgaUb-AKAFfT7iRCw4m8&sai=AMfl-YRyu9cwp1qQ_FU_WJSz5ukVigSbGoQAv5K2IkGYPJwm5af9I8J_cSRAVrYUoxM5HGNkelOurm0aOa9JkhGbrLR0qiAfv3uahKEhG-rW&sig=Cg0ArKJSzHDEWR8-vMHOEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:40 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile1&zMoatRendered=1&zMoatSlotTargetingLoaded=1&zMoatSlotTargetingSet=1&zMoatPageDataTargetingSet=1&zMoatSafetyTargetingSet=1&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=168077864&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Mon, 15 Oct 2018 11:21:40 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Mon, 15 Oct 2018 11:21:40 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/ Frame 3F4A
74 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
bd3584b1408380e4f3cfbcf229de40a5df42982b192159b9145757a5d269eadf
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
Mon, 15 Oct 2018 11:21:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27982
x-xss-protection
1; mode=block
server
cafe
etag
7176381857693900459
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 15 Oct 2018 11:21:40 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/ Frame 3F4A
74 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
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
Mon, 08 Oct 2018 13:12:18 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
598162
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27477
x-xss-protection
1; mode=block
server
cafe
etag
1272360511746383795
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 22 Oct 2018 13:12:18 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 3F4A
0
47 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvvokAVbfludEzhhzMm2fvTMLvF9BHQ3DEcI0ZvI7BhGljxEM8cMFgrFGgeBSY3b1l4QlCnzacO2BJhJyVxs0ML6SMeEbKuvm59tpsFltdZ3NLqvyaodzL3f5VoszYjDdF_ufOWydSFf62DtePLwqVyMnmt0WMyMCF-OnH7Se4WO3eOJxL8HDUbdxpzsTMdzT3QGdLmF_IZt621SG3wOdvHl5rrrAdgWdCm2lQ5bg1AMne9ZSJk7HTGTATBMOM&sai=AMfl-YSw927nzCjVkzrtgiubNG_xIU8oSphoKaofQzGLeLRfDZf3ZbOiPaorPIiH1BpBWsqzzzknSeA0jTGZBk84JvKN0xRvOI4LH_rqSTfK9IBl2u9iZblEHBsJseg&sig=Cg0ArKJSzEaGRAM2X9A-EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:40 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
/
golem.whitepaperdb.de/ Frame 3269
0
0
Document
General
Full URL
https://golem.whitepaperdb.de/?tag=golem
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.138.242.228 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
mail.whitepaperdb.de
Software
nginx / PHP/7.0.32 PleskLin
Resource Hash

Request headers

:method
GET
:authority
golem.whitepaperdb.de
:scheme
https
:path
/?tag=golem
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
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
server
nginx
date
Mon, 15 Oct 2018 11:21:40 GMT
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
x-powered-by
PHP/7.0.32 PleskLin
set-cookie
WIDS=3756
content-encoding
gzip
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/ Frame 8D92
74 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
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
Mon, 08 Oct 2018 13:12:18 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
598162
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27477
x-xss-protection
1; mode=block
server
cafe
etag
1272360511746383795
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 22 Oct 2018 13:12:18 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 8D92
0
47 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvYatErmdcAqpEjSTlC20FKppv-8jec3e4oR8P9BGFAJT7Anr15N-o9SrzwmAuA0w2Kx-MPPaoIlFEeHYlbU9QoFGrHiMIjKOmqEfH3iZ-gDQ_guhJ2PrtNfz5-GVjkyUzAhckkVmRZUU7t-Sk6f5ckaVDZ1qbZRpRvK28h6tnwfzIkpxfmscs3_ACHlXR1sue-uDmML8DyT1ivKERbmUFpU_LvoQ9U3dLeJPt8D33uT5KK8Fv_twvpHKxW02oaFFn0vMUhj3xUU9SiFQ&sai=AMfl-YRZOhMTsVifgN5WXFHxDmUzdzNdxykpdJPouDQm5jA_2iI0-0UHuJHTEmc8LqtNE1joQ1c3kZq43YQKE5YeScB4C4ysNkawQoF1HICmIKMFs3AOEdsKuYaS3hc&sig=Cg0ArKJSzEL8jsuOXJoUEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:40 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
/
iqdigital.demdex.net/event/
42 B
629 B
Image
General
Full URL
https://iqdigital.demdex.net/event/?d_cid_ic=emetriq%01BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr%010
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.154.86.186 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-86-186.eu-west-1.compute.amazonaws.com
Software
/
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

DCS
dcs-prod-irl1-v006-00769b9e6.edge-irl1.demdex.com 5.41.0.20181011114220 10ms
Pragma
no-cache
X-TID
tUPz6KbmTLQ=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=895175949&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=1893485975.1539602500&jid=1225137513&_v=5.7.2&z=895175949
35 B
136 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=1893485975.1539602500&jid=1225137513&_v=5.7.2&z=895175949
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:400c:c0b::9c , 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
date
Mon, 15 Oct 2018 11:21:41 GMT
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Mon, 15 Oct 2018 11:21:41 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1893485975.1539602500&jid=1225137513&_v=5.7.2&z=895175949
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
368
expires
Fri, 01 Jan 1990 00:00:00 GMT
sp_CUHl-113746-i_rc.jpg
www.golem.de/9477/
68 B
486 B
Image
General
Full URL
https://www.golem.de/9477/sp_CUHl-113746-i_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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __gads=ID=2c760a697e5b5626:T=1539602499:S=ALNI_MYIxaJI0RA4zx3qk-uUUcSysDszBQ; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501
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
Mon, 15 Oct 2018 11:21:40 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
ibs:dpid=385489&dpuuid=6612542386376275987
dpm.demdex.net/
Redirect Chain
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fdpm.demdex.net%2Fibs%3Adpid%3D385489%26dpuuid%3D%25%25COOKIE%25%25
  • https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6612542386376275987
42 B
769 B
Image
General
Full URL
https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6612542386376275987
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.246.133.167 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-133-167.eu-west-1.compute.amazonaws.com
Software
/
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

DCS
dcs-prod-irl1-v006-091153f0c.edge-irl1.demdex.com 5.41.0.20181011114220 4ms
Pragma
no-cache
X-TID
1D/noMOgSs0=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

Location
https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6612542386376275987
Date
Mon, 15 Oct 2018 11:21:40 GMT
Server
nginx
Connection
keep-alive
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Transfer-Encoding
chunked
Expires
Thu, 01 Jan 1970 00:00:00 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/ Frame 54F3
74 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
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
Mon, 08 Oct 2018 13:12:18 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
598162
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27477
x-xss-protection
1; mode=block
server
cafe
etag
1272360511746383795
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 22 Oct 2018 13:12:18 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 54F3
0
56 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvX-34JJ263VotrWy7XPQoV4cxbvXqV7hipYaeGwdTOygFpGKurgbYE1NFJOTmuYheCEyoros5Am5ZtJTeMGhTDLYbgCq3hLbQNG84qVJEc353xKy6wWs66w4perPzPtDvuE3SwIrWGM18m0oOSlisIiTgXe-0u1ghaJ3Arb13PWOz9KsJPEzNLlU5K2va2aOpk8fJmP1CEOBUXv9_x3h0dK0Tdh3Q33FYN2Ao7RQM58rtkwOWdzDpXTls&sai=AMfl-YRSjibKDmexhORWWlJF-3Khwv-Z_lML1lff4PJb8UCpqlODmxawx1wtO_mO1PqkBA_XR90GM8HpVpsQ2SbYfLq7qvE1kwtjw2GSZIaZOWQZFTYc7Kfs2H0Ih8w&sig=Cg0ArKJSzCMlv3IxiGbkEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.16.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:40 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
publishertag.prebid.js
static.criteo.net/js/ld/
35 KB
12 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.prebid.js
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
178.250.2.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
248189d2eb134d9b9a979600d2491a9aaa0a813ccb7b1fd89d1b325637ed2bd1

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
Mon, 15 Oct 2018 11:21:40 GMT
Content-Encoding
gzip
Last-Modified
Wed, 19 Sep 2007 08:50:25 GMT
Server
nginx
ETag
W/"5bb1dfb3-8c77"
Transfer-Encoding
chunked
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400, public
Connection
keep-alive
Timing-Allow-Origin
*
Expires
Tue, 16 Oct 2018 11:21:40 GMT
trial-medrec-m7-140.shtml
www.golem.de/microsite/abo/ Frame FE5C
498 B
782 B
Document
General
Full URL
https://www.golem.de/microsite/abo/trial-medrec-m7-140.shtml
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
2c7c618b1b588b77bb4856cefd64f649b25be01324cf11daa2ceacab0869c359

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
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg
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
nginx
Date
Mon, 15 Oct 2018 11:21:40 GMT
Content-Type
text/html
Content-Length
498
Last-Modified
Tue, 24 Jan 2017 20:29:40 GMT
Connection
keep-alive
Keep-Alive
timeout=3
ETag
"5887b934-1f2"
X-UPSTREAM
hybrid1.golem.de
Accept-Ranges
bytes
/
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:79055c955.bb8857a3a_1539602500779,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&1539602500792
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
188.40.114.5 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.5.114.40.188.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
Mon, 15 Oct 2018 11:21:40 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=15&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=79055c955.bb8857a3a_1539602500779&1539602500794
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
188.40.114.5 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.5.114.40.188.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
Mon, 15 Oct 2018 11:21:40 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:79055c955.bb8857a3a_1539602500779,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&__io=79055c955.bb8857a3a_1539602500779&1539602500798
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
188.40.114.5 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.5.114.40.188.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
Mon, 15 Oct 2018 11:21:40 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:79055c955.bb8857a3a_1539602500779,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&1539602500804
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
188.40.114.5 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.5.114.40.188.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
Mon, 15 Oct 2018 11:21:40 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
activation
adstax-match.adrtx.net/ Frame 24B1
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
52.208.127.173 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-127-173.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
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
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
Mon, 15 Oct 2018 11:21:40 GMT
Server
akka-http/10.1.3
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
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
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
Mon, 15 Oct 2018 11:21:40 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
749
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
ca-pub-2342548244565729.js
pagead2.googlesyndication.com/pub-config/r20160913/
133 B
276 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::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
Mon, 15 Oct 2018 10:38:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Sun, 14 Oct 2018 20:52:49 GMT
server
sffe
age
2612
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
125
x-xss-protection
1; mode=block
expires
Mon, 15 Oct 2018 22:38:08 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20181008/r20180604/ Frame 078A
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20181008/r20180604/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:818::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/r20181008/r20180604/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
cookie
IDE=AHWqTUle23-_bfX5ljTRBcjPAi_YbWf2O2-ikuBIgLXp0JB3AkjlcL87VDwOhW1a
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
Tue, 09 Oct 2018 04:11:43 GMT
expires
Tue, 23 Oct 2018 04:11:43 GMT
content-type
text/html; charset=UTF-8
etag
12810928231326100212
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6940
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
544197
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/ Frame 8913
196 KB
73 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
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
Mon, 15 Oct 2018 11:21:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74377
x-xss-protection
1; mode=block
server
cafe
etag
1244184442415605674
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 15 Oct 2018 11:21:40 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
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
Mon, 15 Oct 2018 11:21:41 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
748
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
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
Mon, 15 Oct 2018 11:21:41 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
747
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
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
Mon, 15 Oct 2018 11:21:41 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
746
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
rmpslider-rl_122-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_122-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
f070a404ffa3b35fb0636c3172879da6e87e3703bdb7b225c1872aec5a201c5e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_d=1_705468254; __io=79055c955.bb8857a3a_1539602500779; __io_lv=1539602500779; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; AAMC_iqdigital_0=REGION%7C6; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
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
Mon, 15 Oct 2018 11:21:41 GMT
Content-Encoding
gzip
Last-Modified
Fri, 07 Sep 2018 13:23:44 GMT
Server
nginx
ETag
W/"5b927be0-407e"
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
Thu, 15 Nov 2018 11:21:41 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 80A3
261 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
714f4e2f780abb175838087b85ff1d01271f39a93ac121d42b77011f6d194f0a

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
Mon, 15 Oct 2018 11:21:41 GMT
Content-Encoding
gzip
Last-Modified
Wed, 10 Oct 2018 16:06:50 GMT
Server
AmazonS3
x-amz-request-id
94A98D0003A8CE48
ETag
"83509e3a07b445ada9799cccc5266663"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=32930
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82396
x-amz-id-2
2G11pM2pQluyo+mPKFb0C7u3n0GDwPYyJH7ld/CWwbjQH4hqSa4Ko169ZSRQB4z1c3/b13c23uQ=
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 1338
261 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
714f4e2f780abb175838087b85ff1d01271f39a93ac121d42b77011f6d194f0a

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
Mon, 15 Oct 2018 11:21:41 GMT
Content-Encoding
gzip
Last-Modified
Wed, 10 Oct 2018 16:06:50 GMT
Server
AmazonS3
x-amz-request-id
94A98D0003A8CE48
ETag
"83509e3a07b445ada9799cccc5266663"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=32930
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82396
x-amz-id-2
2G11pM2pQluyo+mPKFb0C7u3n0GDwPYyJH7ld/CWwbjQH4hqSa4Ko169ZSRQB4z1c3/b13c23uQ=
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile3&zMoatRendered=2&zMoatSlotTargetingLoaded=2&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=2&zMoatSafetyTargetingSet=2&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1404715193&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Mon, 15 Oct 2018 11:21:41 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Mon, 15 Oct 2018 11:21:41 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 3F4A
261 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
714f4e2f780abb175838087b85ff1d01271f39a93ac121d42b77011f6d194f0a

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
Mon, 15 Oct 2018 11:21:41 GMT
Content-Encoding
gzip
Last-Modified
Wed, 10 Oct 2018 16:06:50 GMT
Server
AmazonS3
x-amz-request-id
94A98D0003A8CE48
ETag
"83509e3a07b445ada9799cccc5266663"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=32930
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82396
x-amz-id-2
2G11pM2pQluyo+mPKFb0C7u3n0GDwPYyJH7ld/CWwbjQH4hqSa4Ko169ZSRQB4z1c3/b13c23uQ=
truncated
/ Frame 3F4A
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8b73dcb6f008fbe05c9e2da2a0e8748e6f95f718c3325d1023eac75a72c1dc37

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 8D92
261 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
714f4e2f780abb175838087b85ff1d01271f39a93ac121d42b77011f6d194f0a

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
Mon, 15 Oct 2018 11:21:41 GMT
Content-Encoding
gzip
Last-Modified
Wed, 10 Oct 2018 16:06:50 GMT
Server
AmazonS3
x-amz-request-id
94A98D0003A8CE48
ETag
"83509e3a07b445ada9799cccc5266663"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=32930
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82396
x-amz-id-2
2G11pM2pQluyo+mPKFb0C7u3n0GDwPYyJH7ld/CWwbjQH4hqSa4Ko169ZSRQB4z1c3/b13c23uQ=
truncated
/ Frame 8D92
217 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7b52648ea75c5d93863484c006967439a4aa9d0a972c10bd5d828054d34e0871

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
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.228.163 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
Mon, 15 Oct 2018 11:21:42 GMT
Last-Modified
Mon, 15 Oct 2018 04:26:32 GMT
Server
AmazonS3
x-amz-request-id
3C2786712041DD01
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
Gi4D2BPuceRrHEOFD8PK8OHwKOer8SxCldBsHS4LF/7N7EmRLTxhGQEl+8xldyW8X8H41yEwwk8=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
286 B
677 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
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:41 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_d=1_705468254; __io=79055c955.bb8857a3a_1539602500779; __io_lv=1539602500779; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; AAMC_iqdigital_0=REGION%7C6; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
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
Mon, 15 Oct 2018 11:21:41 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-5e9f0"
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
Thu, 15 Nov 2018 11:21:41 GMT
sp_CUHl-524963-i_rc.jpg
www.golem.de/2910/adsmodules/
68 B
486 B
Image
General
Full URL
https://www.golem.de/2910/adsmodules/sp_CUHl-524963-i_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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_d=1_705468254; __io=79055c955.bb8857a3a_1539602500779; __io_lv=1539602500779; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; AAMC_iqdigital_0=REGION%7C6; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
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
Mon, 15 Oct 2018 11:21:41 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
integrator.js
adservice.google.de/adsid/ Frame 3F4A
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:819::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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/ Frame 3F4A
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81c::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

timing-allow-origin
*
date
Mon, 15 Oct 2018 11:21:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
ca-pub-6583763995580712.js
pagead2.googlesyndication.com/pub-config/r20160913/ Frame 3F4A
68 B
175 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6583763995580712.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
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
Mon, 15 Oct 2018 10:29:54 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
age
3107
content-type
text/javascript
status
200
cache-control
public, max-age=43200
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
88
x-xss-protection
1; mode=block
expires
Mon, 15 Oct 2018 22:29:54 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 54F3
261 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
714f4e2f780abb175838087b85ff1d01271f39a93ac121d42b77011f6d194f0a

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
Mon, 15 Oct 2018 11:21:41 GMT
Content-Encoding
gzip
Last-Modified
Wed, 10 Oct 2018 16:06:50 GMT
Server
AmazonS3
x-amz-request-id
94A98D0003A8CE48
ETag
"83509e3a07b445ada9799cccc5266663"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=32930
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82396
x-amz-id-2
2G11pM2pQluyo+mPKFb0C7u3n0GDwPYyJH7ld/CWwbjQH4hqSa4Ko169ZSRQB4z1c3/b13c23uQ=
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile16&zMoatRendered=3&zMoatSlotTargetingLoaded=3&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=3&zMoatSafetyTargetingSet=3&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1134021812&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Mon, 15 Oct 2018 11:21:41 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Mon, 15 Oct 2018 11:21:41 GMT
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
309 B
975 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
143.204.101.112 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-112.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
0f4e7aaf102a3fbf84852a8b63133c28dbec6cdd6435b2168c6303946d4986c0

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
Mon, 15 Oct 2018 11:02:26 GMT
Via
1.1 9ab847fabb8c9edbd39cff57c2a2f4c0.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
2
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
309
Last-Modified
Mon, 15 Oct 2018 11:02:03 GMT
Server
AmazonS3
ETag
"f4ce9156e28294b697c409fc686e523f"
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
ZFOEomTlkaVaTInoYkr2_uFT3RWf2LzVzKluxXMbrzJB7cBqyYe2Yg==
Expires
0
spalte_rechts_Abo_7_2b_300x140px.png
www.golem.de/microsite/abo/trial/ Frame FE5C
11 KB
11 KB
Image
General
Full URL
https://www.golem.de/microsite/abo/trial/spalte_rechts_Abo_7_2b_300x140px.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/trial-medrec-m7-140.shtml
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
b873431147f9279cb441f3aa6f929cce1ecf7f77b0d829fb3e8248651f5aeeb9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/microsite/abo/trial-medrec-m7-140.shtml
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_d=1_705468254; __io=79055c955.bb8857a3a_1539602500779; __io_lv=1539602500779; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; AAMC_iqdigital_0=REGION%7C6; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/microsite/abo/trial-medrec-m7-140.shtml
User-Agent
Mozilla/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
Mon, 15 Oct 2018 11:21:41 GMT
Last-Modified
Tue, 01 Sep 2015 16:30:04 GMT
Server
nginx
ETag
"55e5d28c-2b62"
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
11106
Expires
Thu, 15 Nov 2018 11:21:41 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 46C3
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=3446949021&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500875&bpp=29&bdt=2697&fdt=37&idt=564&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&correlator=7497780083675&frm=20&pv=2&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=4021&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=636311223&ifi=6&fsb=1&xpc=mrJp7zaLeQ&p=https%3A//www.golem.de&dtd=597
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:818::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=3446949021&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500875&bpp=29&bdt=2697&fdt=37&idt=564&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&correlator=7497780083675&frm=20&pv=2&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=4021&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=636311223&ifi=6&fsb=1&xpc=mrJp7zaLeQ&p=https%3A//www.golem.de&dtd=597
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
cookie
IDE=AHWqTUle23-_bfX5ljTRBcjPAi_YbWf2O2-ikuBIgLXp0JB3AkjlcL87VDwOhW1a
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
gzip
date
Mon, 15 Oct 2018 11:21:41 GMT
server
cafe
cache-control
private
content-length
20304
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=79055c955.bb8857a3a_1539602500779&1539602501523
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
188.40.114.5 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.5.114.40.188.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
Mon, 15 Oct 2018 11:21:41 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
hd-main.js
hgc-cf-cache-1.svonm.com/
187 KB
51 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=svASXxNfoe
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
143.204.101.112 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-112.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
99c0e477f266cdc52cdd29e35104923a8d4b8fb510b079aaae74e24efdb23095

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
Thu, 11 Oct 2018 17:04:25 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
3
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 11 Oct 2018 17:03:22 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 9ab847fabb8c9edbd39cff57c2a2f4c0.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
_h3yo4tk9fKAvpDCli69M6BdCAJh7_2jNrBwR8PCi1yEhlTfX333nA==
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile8&zMoatRendered=4&zMoatSlotTargetingLoaded=4&zMoatSlotTargetingSet=4&zMoatPageDataTargetingSet=4&zMoatSafetyTargetingSet=4&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=780140122&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Mon, 15 Oct 2018 11:21:41 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Mon, 15 Oct 2018 11:21:41 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/ Frame 66A8
196 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 15 Oct 2018 11:21:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74377
x-xss-protection
1; mode=block
server
cafe
etag
1244184442415605674
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 15 Oct 2018 11:21:40 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame DA70
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=2459742235&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500912&bpp=20&bdt=2734&fdt=685&idt=686&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=7497780083675&frm=20&pv=1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=4782&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=1823298079&ifi=7&fsb=1&xpc=iFfBv6gKMH&p=https%3A//www.golem.de&dtd=695
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:818::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=2459742235&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500912&bpp=20&bdt=2734&fdt=685&idt=686&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=7497780083675&frm=20&pv=1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=4782&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=1823298079&ifi=7&fsb=1&xpc=iFfBv6gKMH&p=https%3A//www.golem.de&dtd=695
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
cookie
IDE=AHWqTUle23-_bfX5ljTRBcjPAi_YbWf2O2-ikuBIgLXp0JB3AkjlcL87VDwOhW1a
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
gzip
date
Mon, 15 Oct 2018 11:21:41 GMT
server
cafe
cache-control
private
content-length
21001
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/ Frame EE78
196 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 15 Oct 2018 11:21:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74377
x-xss-protection
1; mode=block
server
cafe
etag
1244184442415605674
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 15 Oct 2018 11:21:40 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame E99D
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=653379571&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500932&bpp=6&bdt=2755&fdt=800&idt=812&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=7497780083675&frm=20&pv=1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=5484&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=154924829&ifi=8&fsb=1&xpc=jLLzjGfNMC&p=https%3A//www.golem.de&dtd=834
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:818::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=653379571&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500932&bpp=6&bdt=2755&fdt=800&idt=812&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=7497780083675&frm=20&pv=1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&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=5484&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=154924829&ifi=8&fsb=1&xpc=jLLzjGfNMC&p=https%3A//www.golem.de&dtd=834
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
cookie
IDE=AHWqTUle23-_bfX5ljTRBcjPAi_YbWf2O2-ikuBIgLXp0JB3AkjlcL87VDwOhW1a
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
gzip
date
Mon, 15 Oct 2018 11:21:41 GMT
server
cafe
cache-control
private
content-length
19943
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile4&zMoatRendered=5&zMoatSlotTargetingLoaded=5&zMoatSlotTargetingSet=5&zMoatPageDataTargetingSet=5&zMoatSafetyTargetingSet=5&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=795903487&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Mon, 15 Oct 2018 11:21:41 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Mon, 15 Oct 2018 11:21:41 GMT
truncated
/
187 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
99c0e477f266cdc52cdd29e35104923a8d4b8fb510b079aaae74e24efdb23095

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
text/javascript
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
4 KB
2 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=427667
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2606:4700:30::6818:6624 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
f188307c5e534db931d46117db386a57880d4176d9aba94d2e458de223269df5
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
Mon, 15 Oct 2018 11:21:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
cf-cache-status
HIT
status
200
content-length
1684
timing-allow-origin
*
last-modified
Fri, 12 Oct 2018 16:34:53 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
accept-ranges
bytes
cf-ray
46a1e7572b0f97f8-FRA
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Range
expires
Mon, 15 Oct 2018 12:21:42 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_d=1_705468254; __io=79055c955.bb8857a3a_1539602500779; __io_lv=1539602500779; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; AAMC_iqdigital_0=REGION%7C6; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
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
Mon, 15 Oct 2018 11:21:42 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-e209"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Thu, 15 Nov 2018 11:21:42 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/ Frame 47DF
196 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 15 Oct 2018 11:21:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74377
x-xss-protection
1; mode=block
server
cafe
etag
1244184442415605674
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 15 Oct 2018 11:21:40 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/ Frame ABE4
196 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 15 Oct 2018 11:21:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74377
x-xss-protection
1; mode=block
server
cafe
etag
1244184442415605674
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 15 Oct 2018 11:21:40 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 2FA0
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=3930630304&adf=3574163827&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1539602501226&bpp=14&bdt=1528&fdt=1346&idt=1348&shv=r20181008&cbv=r20180604&saldr=aa&correlator=7497780083675&frm=23&ife=4&pv=2&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=216572098&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=11470&biw=1585&bih=1200&isw=800&ish=250&ifk=3088420174&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=1457
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:818::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-6583763995580712&output=html&h=250&slotname=9888525209&adk=3930630304&adf=3574163827&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1539602501226&bpp=14&bdt=1528&fdt=1346&idt=1348&shv=r20181008&cbv=r20180604&saldr=aa&correlator=7497780083675&frm=23&ife=4&pv=2&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=216572098&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=11470&biw=1585&bih=1200&isw=800&ish=250&ifk=3088420174&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=1457
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
cookie
IDE=AHWqTUle23-_bfX5ljTRBcjPAi_YbWf2O2-ikuBIgLXp0JB3AkjlcL87VDwOhW1a
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
gzip
date
Mon, 15 Oct 2018 11:21:43 GMT
server
cafe
cache-control
private
content-length
13215
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
osd.js
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/ Frame 3F4A
73 KB
26 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/osd.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
fdfc01efb2956b260c841eadb2948b85dda3184d9a933541e933e70ed188817a
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
Tue, 09 Oct 2018 04:27:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
543268
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27010
x-xss-protection
1; mode=block
server
cafe
etag
4497184731343855560
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 23 Oct 2018 04:27:14 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 8D92
42 B
178 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssZ11ev5flBYJp33B6TGJQ2jlboTEbonHgTcllB9dTXc-pNk2hu0KOgE5L-n6v3YUizqnXgP3dtRR-iWAoC9S1EcsZ3MZfJAmJm0mI&sig=Cg0ArKJSzKZflRhKrXRDEAE&adk=1289509276&tt=-1&bs=1585%2C1200&mtos=1205,1205,1205,1205,1205&tos=1205,0,0,0,0&p=848,993,1098,1293&mcvt=1205&rs=3&ht=0&tfs=129&tls=1334&mc=1&lte=1&bas=0&bac=0&avms=geo&rst=1539602500646&rpt=611&ps=1585%2C12327&ss=1600%2C1200&pt=-1&deb=1-5-8-18-10-26-34-1&tvt=1313&r=v&id=osdim&uc=8&tgt=IFRAME&cl=1&cec=8&clc=1&cac=0&cd=300x250&v=r20181008
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::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
Mon, 15 Oct 2018 11:21:42 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
42
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 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?cache=2674115549
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.228.163 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
Mon, 15 Oct 2018 11:21:43 GMT
Last-Modified
Mon, 15 Oct 2018 04:26:32 GMT
Server
AmazonS3
x-amz-request-id
127CF2892264A8AE
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
VP2XD7CihsuMfDbYgsj2KHYXJ/CZKRVgydpK9PrwcommizTDlJxftciCbgYDGp2DPD75S0QsYX0=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
286 B
677 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=9420799519
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
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
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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
Mon, 15 Oct 2018 11:21:42 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 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
ima3.js
imasdk.googleapis.com/js/sdkloader/
230 KB
79 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
9988971ae39a8ea0a86f4a0da61e3876c779ac1db2531dd87937f357817227a3
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
Mon, 15 Oct 2018 11:21:42 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="44,43,39,35"
content-length
81114
x-xss-protection
1; mode=block
expires
Mon, 15 Oct 2018 11:21:42 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

Access-Control-Allow-Origin
*
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

Access-Control-Allow-Origin
*
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

Access-Control-Allow-Origin
*
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
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
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_d=1_705468254; __io=79055c955.bb8857a3a_1539602500779; __io_lv=1539602500779; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; AAMC_iqdigital_0=REGION%7C6; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
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
Mon, 15 Oct 2018 11:21:42 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Thu, 15 Nov 2018 11:21:42 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
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
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adp_segs=e0; adbScroll=; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_d=1_705468254; __io=79055c955.bb8857a3a_1539602500779; __io_lv=1539602500779; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; AAMC_iqdigital_0=REGION%7C6; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
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
Mon, 15 Oct 2018 11:21:42 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Thu, 15 Nov 2018 11:21:42 GMT
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
309 B
975 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=2012609714
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.112 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-112.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
0f4e7aaf102a3fbf84852a8b63133c28dbec6cdd6435b2168c6303946d4986c0

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
Mon, 15 Oct 2018 11:02:26 GMT
Via
1.1 9ab847fabb8c9edbd39cff57c2a2f4c0.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
3
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
309
Last-Modified
Mon, 15 Oct 2018 11:02:03 GMT
Server
AmazonS3
ETag
"f4ce9156e28294b697c409fc686e523f"
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
XNDVGjy4raYXvW-TEUKVXFx0q-7u-d_mXAJ3qhLGIkCQoNNpDCUpFQ==
Expires
0
/
ssl.1.damoh.golem.de/5b86c915248e281403e034594d5025f15c6693bc/
309 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/5b86c915248e281403e034594d5025f15c6693bc/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
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
AmazonS3 /
Resource Hash
0f4e7aaf102a3fbf84852a8b63133c28dbec6cdd6435b2168c6303946d4986c0

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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
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
Mon, 15 Oct 2018 11:21:43 GMT
Connection
keep-alive
Content-Length
309
Last-Modified
Mon, 15 Oct 2018 11:02:03 GMT
Server
AmazonS3
Etag
"f4ce9156e28294b697c409fc686e523f"
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
de4-homad-5
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
bridge3.242.3_de.html
imasdk.googleapis.com/js/core/ Frame 80A8
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.242.3_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:814::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.242.3_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
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
171022
date
Fri, 05 Oct 2018 23:24:36 GMT
expires
Sat, 05 Oct 2019 23:24:36 GMT
last-modified
Fri, 05 Oct 2018 23:15:41 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, max-age=31536000
age
820627
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
client.js
s0.2mdn.net/instream/video/
26 KB
10 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
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:814::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
Mon, 15 Oct 2018 11:21:43 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="44,43,39,35"
content-length
10523
x-xss-protection
1; mode=block
expires
Mon, 15 Oct 2018 11:21:43 GMT
hic_qos
ssl.1.damoh.golem.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.golem.de/hic_qos?adv_partner&_werbebanner_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.55.20 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.46-4-55-20.clients.your-server.de
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
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
Mon, 15 Oct 2018 11:21:43 GMT
Last-Modified
Thu, 11 Oct 2018 09:33:14 GMT
Server
openresty/1.13.6.2
ETag
"5bbf18da-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
/
ssl.1.damoh.golem.de/dd9e2ea59d6afe802af18daa64ed538da4642efc/
110 B
672 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/dd9e2ea59d6afe802af18daa64ed538da4642efc/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.55.20 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.46-4-55-20.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
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
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17820%7CMCMID%7C11426032157103850683234836750593996987%7CMCAAMLH-1540207299%7C6%7CMCAAMB-1540207299%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1539609699s%7CNONE%7CMCSYNCSOP%7C411-17827%7CvVersion%7C3.3.0; adb_dslv=1539602499906; s_cc=true; __utmc=21769261; __utmz=21769261.1539602501.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1893485975.1539602500.1539602500.1539602500.1; __utmb=21769261.1.10.1539602501; __gads=ID=161d18f629a004be:T=1539602499:S=ALNI_MaOwtBfuNGZac9EfIr6hcngxXqlXg; __io_unique_43098=15; __io_uh=1; __io_visit_43098=1; aam_uuid=10813531654945682143188154401728892417; golem_us=c7926139; golem_uv=c7926139; golem_uz=c7926139
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
Mon, 15 Oct 2018 11:21:43 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
/
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:3]&s=6acc7c777cce3be138a245218c439c54&1539602510809
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
136.243.151.13 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.13.151.243.136.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
Mon, 15 Oct 2018 11:21:50 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:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&1539602520818
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
188.40.114.5 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.5.114.40.188.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
Mon, 15 Oct 2018 11:22:00 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

Verdicts & Comments Add Verdict or Comment

229 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| Golem object| _gcpx string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW string| n_pbt boolean| gzipEnabled object| _gafccsi string| iqd_mode object| IQD object| AdController undefined| _ object| AdControllerContainer string| _ADC_VERSION object| regexMatcher object| googletag boolean| isConsent function| setConsentBehaviour function| setMoatPrebidData object| pbjs string| amzAllocations object| apstag function| iqDefineHeaderBids boolean| deliveringAds string| adblocktest string| iqcpurl string| src_xplosion string| src_contentplatform string| src_iqhbprebid string| src_iqhbamazon string| src_yield string| gs_channels object| gsurl string| src_grapeshot string| level2 string| handle object| inViewConfInfos object| toRenderAds object| isRenderAds string| adTile function| createIQLabel function| setIQCreativeSpace function| removeIQLabelAndSpace object| IQD_varPack function| limitHeaderBids function| setIQTile string| iqVisClass string| iqdCI string| iqdCIs undefined| iqLoggerSrc object| IQDAO string| iqYlSite boolean| iqYlNew object| adaYlFormatId object| tmYlFormatId object| iqYlCs object| iqYlObj string| src_yieldlab string| src_yieldlabTM object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken function| _h object| _adexc object| adex object| _satellite boolean| __satelliteLoaded function| Visitor object| s_c_il number| s_c_in object| _ADB function| getReferrerType function| _adbStorageSet function| _adbStorageGet function| _adbCheckScrollOffset function| appendToList function| _adbHandleError undefined| ct undefined| et undefined| hourElapsed undefined| msg undefined| pixelDomain undefined| pxSrc undefined| px object| Moat#G26 object| MoatSuperV26 object| MoatNadoAllJsonpRequest_74731494 boolean| Moat#EVA object| moatPrebidApi object| yl function| pbjsChunk object| __core-js_shared__ object| Criteo object| _EQLService object| _EQPScript function| s_doPlugins function| adbAddMediaEvtHandler function| AppMeasurement_Module_AudienceManagement function| AppMeasurement_Module_Media function| onYouTubePlayerReady function| s_YTp function| s_YTisa function| s_YTism function| s_YTgk function| onYouTubePlayerAPIReady function| s_YTdi function| s_YTei function| s_YTut function| s_YTdv function| s_YTv function| AppMeasurement_Module_ActivityMap function| AppMeasurement function| s_gi function| s_pgicq string| s_account object| s undefined| _videos object| s_YTO function| DIL number| s_objectID number| s_giq object| extData string| delayedData object| GPT_jstiming object| closure_memoize_cache_ object| google_reactive_ads_global_state boolean| google_measure_js_timing string| arg object| iqd_gpt_slots boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id number| google_unique_id object| gaGlobal function| $ function| jQuery object| iAbo function| golemAcceptCookies object| IQDComplete object| _EQPService object| _emqYL string| ada_publisher object| _adrtx object| _emqAdexGif object| _emqConImpact boolean| subDomainCheckVar function| UABPdd object| uabpFlags string| uabpRnd boolean| uabpnl string| szmvars object| iom object| iam_data object| _io_config string| disableStr object| _gaq string| _adbIQCreatives object| s_i_iqdmmgglobalprod boolean| uabpsdl boolean| uabpsdln string| uabpdgenat string| uabpdsthash boolean| uabpforceimp boolean| uabpnewinject function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter object| __google_ad_urls object| t4ftPlacement boolean| google_osd_loaded boolean| google_onload_fired object| adsbygoogle object| IQCreatives object| _emtriqIDImg object| _gat boolean| uabBody boolean| uabpDetect object| uabpd1 object| uabpd2 number| uabpd3 object| uabpd4 object| uabpd5 boolean| uabpij object| __io object| google_ad_modifications function| google_spfd object| google_sv_map object| google_t12n_vars object| google_jobrunner object| google_iframe_oncopy function| Swiper object| iqMoatIdCollector function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| criteo_pubtag object| rmp3pi function| SwfVideo object| exportz object| f string| _io_uniques_holing_params object| uabpMobile object| google_persistent_state_async object| google_pub_config number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| core object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock object| VaehohngAhlungae string| v object| Aw object| Bw function| videopkgInterface 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_279345 string| hic_qos object| closure_lm_310214

0 Cookies

12 Console Messages

Source Level URL
Text
console-api log (Line 20)
Message:
gdpr - query_string
console-api log (Line 2)
Message:
gdpr_header-bidding.js
console-api log (Line 1)
Message:
gdpr_global.js
console-api log (Line 1)
Message:
gdpr_yieldlab.js
console-api log (Line 34)
Message:
gdpr_examine_consent.js
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
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4775329615, Creative-ID-138242228674, tile = 1
console-api log (Line 129)
Message:
IQDAIF ready
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4686089258, Creative-ID-138235188578, tile = 3
console-api log (Line 322)
Message:
Standard Banner :: (3rdPARTY Tag) :: LineItem-ID-4643517062, Creative-ID-138234541632, tile = 16
console-api log (Line 99)
Message:
3rd-Party Redirect :: LineItem-ID-4550221103, Creative-ID-85376452645, tile = 8
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4686089258, Creative-ID-138235188476, tile = 4

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.

aax.amazon-adsystem.com
ad.yieldlab.net
ads.golem.de
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
assets.adobedtm.com
bidder.criteo.com
c.amazon-adsystem.com
cdn.adrtx.net
cdn.emetriq.de
cdn.onthe.io
cdn.radiantmediatechs.com
cm.everesttech.net
cpx.golem.de
cpxl.golem.de
d.df-srv.de
d1pywvbolq0b04.cloudfront.net
de.ioam.de
dmp.theadex.com
dpm.demdex.net
dsp.adfarm1.adition.com
dx6ctphzljkf1.cloudfront.net
dyn.emetriq.de
golem.de
golem.whitepaperdb.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
imasdk.googleapis.com
iqdigital.demdex.net
iqdigitalmediamarketinggmbh.sc.omtrdc.net
iqdtms.golem.de
mb.moatads.com
p.yieldlab.net
pagead2.googlesyndication.com
px.moatads.com
s0.2mdn.net
s3.amazonaws.com
script.ioam.de
securepubads.g.doubleclick.net
ssl.1.damoh.golem.de
ssl.google-analytics.com
static.criteo.net
stats.g.doubleclick.net
tpc.googlesyndication.com
tt.onthe.io
ups.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagservices.com
xpl.theadex.com
z.moatads.com
104.248.100.80
136.243.151.13
136.243.65.40
143.204.101.112
143.204.96.211
172.217.16.162
172.82.228.19
178.250.2.130
178.250.2.89
185.33.223.220
188.40.114.5
2.18.232.23
2.18.232.233
2.18.235.40
2001:16e0:10a:1::c2:1
2600:9000:200d:3200:1c:9fd1:6d00:21
2600:9000:200d:a600:1c:8c89:a300:93a1
2600:9000:200d:de00:1:9777:c740:21
2606:4700:30::6818:6624
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:13c8:f5::f:4b3d:182
2a00:1450:4001:814::2001
2a00:1450:4001:814::2006
2a00:1450:4001:814::200a
2a00:1450:4001:814::200e
2a00:1450:4001:815::2002
2a00:1450:4001:816::2008
2a00:1450:4001:818::2002
2a00:1450:4001:819::2002
2a00:1450:4001:81c::2002
2a00:1450:4001:820::2002
2a00:1450:400c:c0b::9c
34.254.168.35
46.4.55.20
52.208.127.173
52.212.18.79
52.212.57.107
52.216.228.163
52.56.194.133
52.94.216.48
54.154.86.186
54.246.133.167
62.138.242.228
66.117.28.86
77.247.84.128
77.247.84.129
85.114.144.197
85.114.159.93
89.163.159.109
89.163.159.117
91.215.103.64
91.215.103.65
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f
046a037b70269d7d556fcf44f52bae9aeb1f1e0b19d99db8092234582caf5944
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
04d73bd4b01e31323606e2dd5751e2d084346ba3b8b37b64d248382e557443b0
05be491c95781e779006bcb1246f48bb68b330b55634916664eea33cf5fc7aa2
05e78ff4e2786f3ef8952d319c8cb9657cf19e4767a75815ffae9a9161d7635b
08b757c7ef1eaebe9fb2331abd30ecc0a470c2166994c1cfa941c126a698679c
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
0dd2f64205bc74bab5d9ea2c30512d3d6f98b37aa22dd9ce39584ae952032829
0e579d4dbc20169eccce332c687705574c084b63b3ca149482f5bca22fc8f051
0ea37f7f6f24c90816d4f28bdc3aad180d345b868c68a48bb299b925b166218b
0f4e7aaf102a3fbf84852a8b63133c28dbec6cdd6435b2168c6303946d4986c0
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
13906fcafbb0d1ba3ca337243167024200875bb58a7bfd70da39c4c342672a4f
1432a44ccb889e96b316ba9a1145fc9c7af7b5743a5dcc7cc70b43d5ba4008d3
156191433d18ae86b08296d93e8b87f6e6448fd6d80c4dfcb7033618fc9fd900
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
18399409a85594ff2fae84d5bd21f911b6327e0b212405133bd58754f4f5e27c
198841347aa586b5f41f72e80e280f540ef3d2574ae2e3ea065274be8d2e10a7
1dbf1a79ef158a348b22d885ae4140e415a53b4eccdd78597724e5225c315585
1df2793d0c81d2642c32cd1dd0655a8539f265ae7da0a6b1ee0c6f20e79a2cc5
1e5f7ba50ebbf1e14eaee59f36c04b1afdde21ba4719fc729358d192d45926a6
1f4984549a34e848abfda3ce130dc42ada0f60bf40b82e9089a1edb8d586c6ca
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
20b5e1cd06d35ba81cd1742266d3e180f3a2f14f4d775831ff412cd1c4b38fdc
20c380a6ec53985b6410d58f337e9de1058d698cc487296d7369a714443b861b
248189d2eb134d9b9a979600d2491a9aaa0a813ccb7b1fd89d1b325637ed2bd1
2bdb9058c86c9b82b28d52d721fb75df307033cac39891be256b4f74bbb1b083
2c7c618b1b588b77bb4856cefd64f649b25be01324cf11daa2ceacab0869c359
312230f329d2013ee52679a6e90e34a808400553786003d3baa78f66cbc6048d
317bfc347737695e008dddb81627fd396dfa90fa22110e7e0703282358e34bd6
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
35065d83d09b7e4a34ff968875619cf60eed78f4efaddba3ddabea07948b44cd
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
3661be8761631375ba3857628a44911f9f87bccede66684a59c075307a2112c8
37df35d3239bc1ef2607da996cfbf534d44fb6d14f18e069b58bcc6b40094b22
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
3ed66de10872a55843f3e6127ad7eecebd55cec2be60110bdfc31c422ec81a1a
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
45661a3e6863d0c77529828a7bd5bc802d65fb7dbce6d7fde4df6d05f3394954
48e304e2056b22e5ad24dc55ca80a5b12ade12ea36bdc1a8e076f807185f0c3a
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4db0ec8cb8b9540643f5700716a271b7bed33189a9b4da3abdabb937d1a0fefd
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
4f14c38d61b8e73a60ac7da136f9187d1b2ceca4feaebc163ebe713ec53db556
51187cf01d85f0c915738349bae225b59355553655ec227a638b4415bd25b1ad
54a5c9011a4eec01cb0af8620d0ce3dd3bba04b167b7f674b074428eeb06e020
58b2814e612da4147df41cbfae3a68267f8692c4ef03237a924f03fe3c1c4a74
5a27f0a4435afbed756504770086d26323ff077b2b75c5fa122509f2ebf7fe33
5a3deef5e530b64438564db35cae5c43ff61b20216e1d8fea6986f30daeb7b20
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5b497fdd4b287fa5dcea22bb695c3aa03a1587b48d4ea421c7ee2cb330622693
5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5ec22c032553124e39ba1e3d1b29109d98994eae906bd44525f687869bd34268
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
64a2022c34b7a10cc67930bfc0efb05ebfa45177bdf6ffb2d61cf2afe8f2e8d4
69f010ce6969b6ef9a337ee45c7d1b35fe5b6e83e10a1f035f166c1ad1f1e7b2
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6f1a751d715f8302303e21796078d0e1f703fde52f8edb3650ca615ec426d78e
712de2c0d71111464584bfc05bc5c14fbbd0950bcbf0aa9422910d1614219c81
714f4e2f780abb175838087b85ff1d01271f39a93ac121d42b77011f6d194f0a
75e55a1492e4994ddf20aac7091cdad173492ca825d19b54cd9c871ddae2b069
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
767f30462b66c83a8102ae92e82faedd6dbe2cabeb12dc84e18c5df853c8c205
77debc14932e6671687807adcbdcf346d00505a972d899677ae14186f420d768
796de1d485776ba39ec2fce23af8f5355d2f8d2ccf05330c02d2b9786a48dff1
7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
7b2fcaffe75c5ab284aac9f968e17afd464b727906072f5c0fc2770ac5a5649c
7b52648ea75c5d93863484c006967439a4aa9d0a972c10bd5d828054d34e0871
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
7eb89a8170e16676f644e05898b986be5f3eb185a9edce74ab383ec74b753974
7fcea5964a341a83cef5d4a34c392a84acb7d6be637b6682fdf0e88789fb2398
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
86aa8ea778d1af5e74eb94ab8afcac373bd0702a313c826ffcf53f25c1a9f645
877a62aadf35c3d4c3b6f875e0caedcd0471f95760ea3b1431ed990c17f7f93a
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8aa5ecb436d5726b7384465a17ebc79f18cc3581509af24644cd5aac34fdd298
8b73dcb6f008fbe05c9e2da2a0e8748e6f95f718c3325d1023eac75a72c1dc37
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
8cf8808ef1646523c63bc3dab8c5a3ca9daa9c1fade671f2811aa225611b68d4
9165223efb9daa9f4345a53773e072a5250ef4aafb9c9ad9b8231a7c3c51bd74
916add75e0a735944e7edb61b5fbd0b880050e17b0b849475e329891cb7d3399
92fe406f0a0efbe09ac10f4f4bba4819d0932a5881035623ce7fc463622b1b91
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
94902eefe10eb456ea93480b5432d59d8a2bcd6c1d72718b8011f204111c3923
94f413638bd2979f77ece1a8ba90a9a8df95b35c39ecc56229cd9eb07b6d93a7
95e4236cf00268f59ec1287e0823e4fedb466ff7f708b102536fffdda40b9d4c
9633c400a446273656ca565e55de70519ce5d3c9834f02ac17117d1504affc63
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9988971ae39a8ea0a86f4a0da61e3876c779ac1db2531dd87937f357817227a3
99c0e477f266cdc52cdd29e35104923a8d4b8fb510b079aaae74e24efdb23095
9c741867cf113f7d2ca9c80a2ce1c27504b85cc69604c009ff084e75aba312e7
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
ad0a38b4c9b7800b01a4b29d1de6ed220fea5842b8f3c00212842521344f7a4b
ad193e4bc2ded2978fe66af53cd54919a7512397ac5f470490689df7350a3b76
ade647cbdadc97e5b51be05d1a4d158981dd24ead69e64ac2a3af095c85bc9aa
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b873431147f9279cb441f3aa6f929cce1ecf7f77b0d829fb3e8248651f5aeeb9
bab83b193535b10097ce431498e9bde3986f2dbc0fdc5799d9b3f28091f0151f
bb195b4fef43f516764b496131499351d9ec957a079dadd4479e75d58b0f65d4
bd3584b1408380e4f3cfbcf229de40a5df42982b192159b9145757a5d269eadf
bd9f60535bfec511504a1970dfb4de1533465cca024b7315239d19120cf79de3
be129a732f0bc1f5d65549965eb26714382c9c57997d55e083a99ea9b3e257cb
c2c56acd0e19741271b335df083eb9e3213b00c18d070823b133e9d0565676cd
c5b32c5631f62f6b07f11aa150fb545e1b7887bb6e82464401794854ea7e6e2d
c717c26c23927b42fdeea4a25e96d181c272e685f67b4422626ac49488c5fae9
cb3a8fa506766029a3d52628ac44bf6ad94bc55797615606eef619b84c603d95
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfa8e5dcda33c97a0909f42e9e418163a67d030c6c650b6bdc3080a06578c757
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d77b6c18c0744a7ad3e394c6de665cfec35053d2ccc2e3d31aaece762cf6bbfd
d9a293add5cfd10491411e829d2e38b48264dff08db1b7b275bad833e98ba500
e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e668501a20dabf5bc0f740d59041e9b18983fbcad8a99dc1a1ee360f545c779d
e6f7ef4bae883c5f899f7a5c88f061afb2c40b35213e4124bfc6749be3150d50
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
e97143383a48b39eb42ccb6641efa01e33979e3dbc0390b69d1892ce62787688
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ec734c8897764322b10b819d78cc8933f050ba27cc3f971ee23ea91b9fdc958e
eddea379f08f5c8557f0606cc6df527ecaa380725d961ee04594b7611d38e191
eebd6f2e5a80bb5d11966fd2446842888fcefdc5b18a36a619aa6fa0756e9376
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f070a404ffa3b35fb0636c3172879da6e87e3703bdb7b225c1872aec5a201c5e
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f188307c5e534db931d46117db386a57880d4176d9aba94d2e458de223269df5
f2a3ae0a2aade858fa2ebe1d687695e83c0a3012dfbbc786cd9f3104cd9a68d3
f533092b0aa60e3071e9d17e494d5b730277dbad1d3a9f71398c3519b4e39cb5
f6041669274cec9ad6f058faa18e3878c21a53c94a7d2e5541be2b9cb4edfccf
f63aa01039149e3d1de90c4a01f612fc78cdf6b6e774993f0359d106ac58f7be
fa2250cbc458f307aa1dbaacc443c2adbb833ced7807b2af0e48d7ec1750ee5c
fb15ac1b2757dbec372ceae76808222992021e044be0a498f9a2398aa197dff4
fdfc01efb2956b260c841eadb2948b85dda3184d9a933541e933e70ed188817a
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe