GET
H2
|
200
|
Primary Request
/
Show response
www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Redirect Chain
-
http://arabshops.xyz/
-
https://arabshops.xyz/
-
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
|
126 KB
33 KB
|
354ms
332ms
|
Document
text/html |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
|
GET
H2
|
200
|
lato-v16-latin-ext-300italic.woff
www.pcgameshardware.de/commoncfm/fonts/
|
23 KB
24 KB
|
36ms
32ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-300italic.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- bf1616bb71ecd23e8b4165960645fc704c08e37f097ad8f85b7a086d1dcf27de
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
lato-v16-latin-ext-400italic.woff
www.pcgameshardware.de/commoncfm/fonts/
|
31 KB
31 KB
|
47ms
42ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-400italic.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- c97815ad3bf836134238414d63b74f94b80dcf4c82f0f3b33c80bf82e0cb566b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
lato-v16-latin-ext-300.woff
www.pcgameshardware.de/commoncfm/fonts/
|
31 KB
31 KB
|
42ms
37ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-300.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 6b4d0c29444c24800b5b71791e9648490288e23163cb48b64b03ec6c6fd5ab24
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
lato-v16-latin-ext-400.woff
www.pcgameshardware.de/commoncfm/fonts/
|
30 KB
30 KB
|
31ms
26ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-400.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 8badcd604652360c68c0677ba0772d2973f2cfe293b5679fec3d1d63018d396e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
lato-v16-latin-ext-700.woff
www.pcgameshardware.de/commoncfm/fonts/
|
30 KB
30 KB
|
30ms
25ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-700.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 66bdd962ad3c4a394964e44600d43808fc3377e3323e00c86213c2564aae5651
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
lato-v16-latin-ext-900.woff
www.pcgameshardware.de/commoncfm/fonts/
|
29 KB
29 KB
|
42ms
37ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-900.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- ce10c90083eaa6eb101084f0955b0a03410b15094d0c2fbaa0c476d0ec98e9c5
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
montserrat_400.woff
www.pcgameshardware.de/commoncfm/fonts/
|
14 KB
14 KB
|
40ms
35ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/montserrat_400.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 81c3f88a8b295295195a4eb5286402a7e7e294a6524854d762f9610cb75e4360
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
montserrat_700.woff
www.pcgameshardware.de/commoncfm/fonts/
|
12 KB
12 KB
|
37ms
33ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/montserrat_700.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 5a81cd792636b7944f81da6c0eabc7a2c4d16895730b6f56c5de4d231affcad6
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
montserrat_900.woff
www.pcgameshardware.de/commoncfm/fonts/
|
12 KB
12 KB
|
34ms
30ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/montserrat_900.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 7dde4e862b9ec4153c85160c5e809d37d8da5e5c4141a2e438b3b28aa00e66f2
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
fontello.woff
www.pcgameshardware.de/commoncfm/fonts/
|
28 KB
29 KB
|
28ms
24ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/fonts/fontello.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 2eedf4d523d65318a57e8119d8be12c2640fec354e2961d28f42de154023cc41
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
200
OK
|
I99SivONLxYO
Show response
cdn.onthe.io/io.js/
|
74 KB
28 KB
|
105ms
47ms
|
Script
text/javascript |
116.203.211.59
HETZNER-AS
|
|
|
GET
H2
|
200
|
general.css
www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/
|
622 KB
89 KB
|
36ms
31ms
|
Stylesheet
text/css |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/general.css?12362
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 7202db234777e26c6bf39dd6b4aaadefc016020c30c7668db098ca4c7a370fdb
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
article.css
www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/
|
347 KB
55 KB
|
35ms
30ms
|
Stylesheet
text/css |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/article.css?12362
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- f86e7d6581062850dac1f0eb3ad6555555590dc0f22fed734fa49758c6e127eb
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
cfremote-min.js
Show response
www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/
|
342 KB
97 KB
|
37ms
32ms
|
Script
application/javascript |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/cfremote-min.js?12362
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 23cfba2cd4d82f5a2ee8ebb52ad2d86ffa5b992b3156e67c65286aff7b26e3c1
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
general-min.js
Show response
www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/
|
292 KB
86 KB
|
43ms
38ms
|
Script
application/javascript |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/general-min.js?12362
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- bb14b95ff85acf21cbb8809d435950bb8580deb6f3a8f0b83360adcbc7866e17
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
article-min.js
Show response
www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/
|
551 KB
159 KB
|
50ms
46ms
|
Script
application/javascript |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/article-min.js?12362
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 11f68cee4a89f44fc4b20df5e06b98e37f37e5a4ebbfa43efe03599dbca67082
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
ads.js
Show response
www.pcgameshardware.de/bcommon/js/
|
21 B
153 B
|
36ms
32ms
|
Script
application/javascript |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/js/ads.js?12362
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- abd9155ac0fe0e62fdb9e2c1c333357cd33107972a57eff5224b0f3d0d2df316
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
38 KB
11 KB
|
89ms
30ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H2
|
200
|
metaTag.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/
|
271 KB
61 KB
|
30ms
12ms
|
Script
application/javascript |
2a02:26f0:10:28e::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
fc.js
Show response
www.pcgameshardware.de/common/deliverad/
|
946 B
514 B
|
32ms
31ms
|
Script
application/javascript |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/common/deliverad/fc.js?v=15
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 58b29ffd944cf81b5c16f7fbbfa6931292eae2152038644a80218e5af68fc566
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
trckUtil.min.js
Show response
www.pcgameshardware.de/bcommon/js/
|
2 KB
925 B
|
43ms
43ms
|
Script
application/javascript |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/js/trckUtil.min.js?v=6
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- e4bb456d09aad2e36bafd434bded4edac5aa7a15ff9101c31d67855a3fb53eed
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
wz_tooltip_centerwindow_followscroll-min.js
Show response
www.pcgameshardware.de/bcommon/js/
|
24 KB
8 KB
|
32ms
32ms
|
Script
application/javascript |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/js/wz_tooltip_centerwindow_followscroll-min.js
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- d598544c0552db299731c3a25bb84fb1226b7594dfd17d2de0a1578593f699c3
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
header_logo_big.png
www.pcgameshardware.de/static/gfx/
|
3 KB
3 KB
|
30ms
29ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/static/gfx/header_logo_big.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 34d4e6eadae686e27a2d4ef5f1b4e9a43a3682ae26f2cdd5622716541cfdf697
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
online_abo_logo.svg
www.pcgameshardware.de/static/gfx/header/
|
3 KB
1 KB
|
29ms
21ms
|
Image
image/svg+xml |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/static/gfx/header/online_abo_logo.svg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- cfc35813922283b122afa06e56a0ad6219e1f000513b3d65fee1d43977dd2bad
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
pcgh_plus_invert3.svg
www.pcgameshardware.de/static/gfx/header/
|
2 KB
846 B
|
27ms
27ms
|
Image
image/svg+xml |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/static/gfx/header/pcgh_plus_invert3.svg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- d9da9ed2eb7155b34e207489b97d7b3c8a3a99f564178ee8f2af3e84d4be7643
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
logo_gw.png
www.pcgameshardware.de/static/gfx/header/
|
1 KB
1 KB
|
33ms
32ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/static/gfx/header/logo_gw.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 2003b66dc1b88a44328998588c72828a68e3161fef2bd811277b0f1978227224
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
Apple_iPhone-11-Pro_Colors_091019-pcgh_b2article_artwork.jpg
www.pcgameshardware.de/screenshots/original/2019/09/
|
11 KB
11 KB
|
42ms
36ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/original/2019/09/Apple_iPhone-11-Pro_Colors_091019-pcgh_b2article_artwork.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- aaba6871f3726b9b780ae513b7d5fd323267dddf5ae0262f01b9376523f2b9cc
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
Amazon-1.png
www.pcgameshardware.de/screenshots/original/2018/11/
|
2 KB
2 KB
|
23ms
17ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/original/2018/11/Amazon-1.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 43af7f7c9db712933120add636bbfa56a8ce4fe9c069b3a598d85b93136ca474
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
apple-tim-cook-2017_apple_b2teaser_169.jpg
www.pcgameshardware.de/screenshots/237x133/2017/10/
|
2 KB
2 KB
|
34ms
28ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/237x133/2017/10/apple-tim-cook-2017_apple_b2teaser_169.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 9b165d67b7e20528115805f0ebfd9f07fe06cfd37402ef2d3d0f8b05d4bca3ec
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
tim_cook_billionth_iphone-pcgh_b2teaser_169.jpeg
www.pcgameshardware.de/screenshots/237x133/2016/07/
|
7 KB
8 KB
|
40ms
34ms
|
Image
image/jpeg |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/237x133/2016/07/tim_cook_billionth_iphone-pcgh_b2teaser_169.jpeg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 7b11b952f13dbd2e8c6e8af03b4f5b45beb54a3a4f42d3c2030c9e8fd17b0328
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
Apple-iPhone-SE2-Rendering_Svetapple_02-pcgh_b2teaser_169.jpg
www.pcgameshardware.de/screenshots/237x133/2020/01/
|
6 KB
6 KB
|
43ms
37ms
|
Image
image/jpeg |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/237x133/2020/01/Apple-iPhone-SE2-Rendering_Svetapple_02-pcgh_b2teaser_169.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 6f4c43ca3e0b1fd9376c0f9178cf9489517f12618a3f8df29d352a32b3105324
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
aufmacher_grundlagen-pcgh2.png
www.pcgameshardware.de/screenshots/1020x/2018/04/
|
495 KB
495 KB
|
48ms
42ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/1020x/2018/04/aufmacher_grundlagen-pcgh2.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- d121b006fa8860b89d47fd1e8480b3462367cb179c6fc027b395fd1d175232d5
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
200
OK
|
blank.gif
vg01.met.vgwort.de/
Redirect Chain
-
https://vg01.met.vgwort.de/na/d5d6a0d084c24736a53dc60d0ffae72c
-
https://vg01.met.vgwort.de/blank.gif
|
43 B
332 B
|
23ms
22ms
|
Image
image/gif |
161.156.66.178
SOFTLAYER
|
|
|
GET
H/1.1
|
200
OK
|
82139.jpg
icdn.computec.de/videos/img/medium/2019/10/
|
139 KB
139 KB
|
106ms
29ms
|
Image
image/jpeg |
62.146.104.136
QSC-AG-IPX
|
|
|
GET
H/1.1
|
200
OK
|
82604.jpg
icdn.computec.de/videos/img/medium/2020/2/
|
63 KB
63 KB
|
107ms
30ms
|
Image
image/jpeg |
62.146.104.136
QSC-AG-IPX
|
|
|
GET
H/1.1
|
200
OK
|
82670.jpg
icdn.computec.de/videos/img/medium/2020/3/
|
89 KB
89 KB
|
107ms
30ms
|
Image
image/jpeg |
62.146.104.136
QSC-AG-IPX
|
|
|
GET
H2
|
200
|
cms-teaser_doom_002_DOOM_64.jpg
www.pcgameshardware.de/bcommon/images/doometernal/
|
38 KB
38 KB
|
27ms
21ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/images/doometernal/cms-teaser_doom_002_DOOM_64.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- aeb56ce2d669c7b17da5da917da0f52586eee444da9fd8601ecd4781819ac5f8
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
rollen.gif
extreme.pcgameshardware.de/images/smilies/
|
704 B
869 B
|
71ms
58ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://extreme.pcgameshardware.de/images/smilies/rollen.gif
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- cad7f640b619c4106c582a266103856ff6d2cccbcbccbe6b47cdc034d3967309
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
s000.gif
extreme.pcgameshardware.de/images/smilies/
|
111 B
267 B
|
45ms
32ms
|
Image
image/gif |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://extreme.pcgameshardware.de/images/smilies/s000.gif
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- a3050846a05163a504898c44991f9e3a84b37c79d69024cb05974b3f56d2bf06
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
cool3.gif
extreme.pcgameshardware.de/images/smilies/
|
228 B
357 B
|
51ms
39ms
|
Image
image/gif |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://extreme.pcgameshardware.de/images/smilies/cool3.gif
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 502d097eaad24c84c53d916f8ae0a6d28c9ff448294b60d2bc00a2b26546f1b3
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
lolaway2.gif
extreme.pcgameshardware.de/images/smilies/
|
5 KB
5 KB
|
45ms
32ms
|
Image
image/gif |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://extreme.pcgameshardware.de/images/smilies/lolaway2.gif
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 836fd3e4ba533c754e5b0ff9864a98a790d2e045862ed7a1d5e97001356aa0e8
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
PCGH_0420_Cover_MAG_Web1.jpg
www.pcgameshardware.de/covers/74x96/
|
4 KB
5 KB
|
24ms
18ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/covers/74x96/PCGH_0420_Cover_MAG_Web1.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 32a3c6c7d7c5fbbeb9871f6b57cae30c72a287a07eea30d102797dbb72542446
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
PCG_0320_Cover_Magazin_web.jpg
www.pcgameshardware.de/covers/74x96/
|
3 KB
4 KB
|
31ms
26ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/covers/74x96/PCG_0320_Cover_Magazin_web.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 2b582dd879de6ce77ba9b99253545aeed20bb14a913ec571a94c28cc656fc88d
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
MMORE_03_2020_Cover_Print.png
www.pcgameshardware.de/covers/74x96/
|
12 KB
13 KB
|
47ms
41ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/covers/74x96/MMORE_03_2020_Cover_Print.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 27c48230a4bfe9e520f92aa4d1dcf961431280c5d30a6ef7dab31af50aa0859d
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
play4_Cover_0420_web.jpg
www.pcgameshardware.de/covers/74x96/
|
4 KB
4 KB
|
34ms
29ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/covers/74x96/play4_Cover_0420_web.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- a702593ee43003e6aad230188b8724f37cce08eecc412e71d6dff596fbe16462
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
GA2003_Titelseite_web.jpg
www.pcgameshardware.de/covers/74x96/
|
4 KB
4 KB
|
34ms
29ms
|
Image
image/jpeg |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/covers/74x96/GA2003_Titelseite_web.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 5c4bf2650f33f2d1060d95e525425062889336b4d672bdf2bed2b7ba68f70fcc
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
XBG_01-0318_U1_Cover.jpg
www.pcgameshardware.de/covers/74x96/
|
4 KB
4 KB
|
41ms
36ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/covers/74x96/XBG_01-0318_U1_Cover.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- ec154b3d01478b3b071142b233395a62a179fbb3fe8e0678bda50dc41fbafe8f
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
pcgmmore.jpg
www.pcgameshardware.de/bcommon/gfx/appcover/
|
4 KB
4 KB
|
45ms
40ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/gfx/appcover/pcgmmore.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 48f9c4165e95dfbd77f9e00f3560714e57fb55d6e13b2b3eb963b12a62480653
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
ct_kiosk.gif
www.pcgameshardware.de/bcommon/gfx/appcover/
|
2 KB
2 KB
|
33ms
28ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/gfx/appcover/ct_kiosk.gif
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- c09bad8a8a725aa2c53c0cff2002b9a67e71698f30a377a0a2dfc8d1d54ef06b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-computec-pcgameshardwarede/
|
98 KB
20 KB
|
77ms
23ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
General
- Full URL
- https://cdn.taboola.com/libtrc/stroeer-computec-pcgameshardwarede/loader.js
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- d3cf2709e10ef178a4a4a0ae0ff2c7ce6179ce99c28e6b2ed5a8f696cdac44c7
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
44 KB
18 KB
|
10ms
6ms
|
Script
text/javascript |
2a00:1450:4001:814::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
cx.js
Show response
scdn.cxense.com/
|
101 KB
24 KB
|
30ms
7ms
|
Script
application/x-javascript |
2a02:26f0:6c00:180::268b
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
43 KB
15 KB
|
81ms
32ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
304 KB
92 KB
|
100ms
39ms
|
Script
application/javascript |
143.204.202.12
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
126 KB
49 KB
|
73ms
32ms
|
Script
text/javascript |
92.122.254.186
AKAMAI-AS
|
|
|
GET
H/1.1
|
302
Moved Temporarily
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
0
-1 B
|
93ms
41ms
|
XHR
text/plain |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-...
-
https://nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Sm...
|
2 KB
2 KB
|
56ms
37ms
|
Script
text/javascript |
2600:9000:214f:3000:1f:a1b:34c0:93a1
AMAZON-02
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:214f:3000:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- 5768e8c817b17a47f348cae0181f7fe4cf43f55f58acfb6df553c69c99cd6264
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
211 B
|
81ms
26ms
|
XHR
application/vnd.api+json |
193.46.63.75
INFONLINE-AS
|
|
General
- Full URL
- https://irqs.ioam.de/identitystatus?offerIdentifier=gamworld&siteIdentifier=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.18829218398263392
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoo...
-
https://de.ioam.de/tx.io?st=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoo...
|
0
694 B
|
26ms
25ms
|
Script
application/x-javascript |
91.215.103.65
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000f&i2=000ff44cf303694245e6fdcc3&ep=1614308887&vr=416&id=sxnjyl&i3=000ff44cf303694245e6fdcc3%3A1613160515561%3A1584389315561%3A.pcgameshardware.de%3A1%3Agamworld%3Ac_pcgh_ArticlePage_TelekommunikationInternetdienste%3Anoevent%3A1584389315561&n1=1&dntt=0<=1584389315564&ev=&cs=iqlzx0&mo=1&sr=71
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.103.65
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de3.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.06.2 0041
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
lato400.woff
www.pcgameshardware.de/static/fonts/
|
45 KB
42 KB
|
29ms
29ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/static/fonts/lato400.woff
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 336e47855a2634b17ab1e87428f96b51e21a434dca8c8327b47dc0fd2e0d3b51
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/uniques/
|
33 B
559 B
|
147ms
49ms
|
Script
text/html |
95.216.24.148
HETZNER-AS
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
179 B
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
4 KB
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
81933.jpg
icdn.computec.de/videos/img/medium/2019/9/
|
106 KB
106 KB
|
46ms
29ms
|
Image
image/jpeg |
62.146.104.136
QSC-AG-IPX
|
|
|
GET
H2
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=1796390970&t=pageview&_s=1&dl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akk...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=348972104&_gid=1542115608.1584389316&gjid=1628207933&_v=j81&z=750171865
|
35 B
102 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:400c:c0c::9d
GOOGLE
|
|
General
- Full URL
- https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=348972104&_gid=1542115608.1584389316&gjid=1628207933&_v=j81&z=750171865
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:400c:c0c::9d
Brussels, Belgium,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
/
Show response
player.pcgameshardware.de/
Frame FABB
|
27 KB
10 KB
|
85ms
74ms
|
Document
text/html |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/cfremote-min.js?12362
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- b2d230535a19145ec91163e3b639055373f97dfdecb0deb906df36640ef8cab9
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
amazon-logo.png
www.pcgameshardware.de/commoncfm/gfx/
|
6 KB
6 KB
|
25ms
24ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/commoncfm/gfx/amazon-logo.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- fa8374431ef56512ba068fed04a9ec2d944a74d5903519d98ff31993ea5e9ef5
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
H2
|
200
|
nextPageLinkArrow.svg
www.pcgameshardware.de/bcommon/gfx/
|
404 B
345 B
|
23ms
23ms
|
Image
image/svg+xml |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/bcommon/gfx/nextPageLinkArrow.svg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 3f278cac0893870edce9c0f4895150615ff63209b21e2e557721e6b6dcacd677
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
97 B
633 B
|
41ms
41ms
|
XHR
application/json |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H2
|
200
|
6310.jpg
www.pcgameshardware.de/authors/babel/
|
5 KB
6 KB
|
26ms
25ms
|
Image
image/jpeg |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/authors/babel/6310.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 4f275e3771732bbad37fec49cc3b910b50d4e2eb019a5b25e6e9e0d45783704a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
load.js
Show response
widget.perfectmarket.com/stroeer-computec-pcgameshardwarede/
|
3 KB
2 KB
|
243ms
190ms
|
Script
application/javascript |
151.101.113.181
FASTLY
|
|
|
GET
H2
|
200
|
impl.20200315-35-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
445 KB
126 KB
|
24ms
23ms
|
Script
application/javascript |
151.101.14.2
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
beacon.js
Show response
sb.scorecardresearch.com/
|
1 KB
1 KB
|
73ms
24ms
|
Script
application/x-javascript |
23.11.238.95
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
segment
Show response
api.cxense.com/profile/user/
|
77 B
647 B
|
78ms
22ms
|
Script
text/javascript |
147.75.85.120
PACKET
|
|
General
- Full URL
- https://api.cxense.com/profile/user/segment?callback=cXJsonpCBk7uwho5fvgkrv3bh&persisted=fc3abe261f02c0f548147da23b3675b2640ae212&json=%7B%22identities%22%3A%5B%7B%22id%22%3A%22k7uwho5egekaeoyf%22%2C%22type%22%3A%22cx%22%7D%5D%7D
- Requested by
- Host: scdn.cxense.com
URL: https://scdn.cxense.com/cx.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
147.75.85.120
Parsippany, United States,
ASN54825
(PACKET, US),
- Reverse DNS
- Software
-
Jetty(9.2.z-SNAPSHOT) /
- Resource Hash
- c4f36585bc4292f006b8f5445f7f002e3205e5e33f6e92d166131f58366f9b2d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
rep.gif
scomcluster.cxense.com/Repo/
|
43 B
467 B
|
113ms
30ms
|
Image
image/gif |
178.63.12.208
HETZNER-AS
|
|
General
- Full URL
- https://scomcluster.cxense.com/Repo/rep.gif?ver=1&typ=pgv&rnd=k7uwho47t9rby1lb&acc=0&sid=1132874718538223433&loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ref=&gol=&pgn=<m=1584389315671&new=0&arf=0&tzo=-60&res=1600x1200&dpr=1&col=24&jav=0&bln=en-US&cks=k7uwho5h6h3733mg&ckp=k7uwho5egekaeoyf&glb=&chs=UTF-8&wsz=1600x1200&amo=1568312880&cp_cmd-template=desktop&cp_cmd-userstatus=guest&fls=0&flv=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
178.63.12.208
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- de716.cxense.com
- Software
-
Jetty(9.2.z-SNAPSHOT) /
- Resource Hash
- 4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
|
GET
H2
|
200
|
avatar_default.png
www.pcgameshardware.de/static/gfx/editors/
|
933 B
1 KB
|
19ms
18ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/static/gfx/editors/avatar_default.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- ae0ac548b351118d3035acaa48ed2397e244bc56d317b3bd3e9315bbfca70ab2
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
avatar82385_1.gif
extreme.pcgameshardware.de/customavatars/thumbs/
|
2 KB
2 KB
|
21ms
21ms
|
Image
image/webp |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://extreme.pcgameshardware.de/customavatars/thumbs/avatar82385_1.gif
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- ef0eeb62ddcb7860f2d4b731062f35a70fe508a039c06af5ebd3c5ed4479fa5b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.be/adsid/
|
109 B
778 B
|
41ms
17ms
|
Script
application/javascript |
2a00:1450:4001:818::2002
GOOGLE
|
|
General
- Full URL
- https://adservice.google.be/adsid/integrator.js?domain=www.pcgameshardware.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
16ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81e::2002
GOOGLE
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.pcgameshardware.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2020030501.js
Show response
securepubads.g.doubleclick.net/gpt/
|
165 KB
60 KB
|
32ms
31ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
87 KB
25 KB
|
96ms
47ms
|
Script
application/javascript |
143.204.201.153
AMAZON-02
|
|
|
POST
H2
|
204
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
82ms
30ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H2
|
200
|
footer_logo.png
www.pcgameshardware.de/static/gfx/
|
943 B
1 KB
|
23ms
23ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/static/gfx/footer_logo.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 0145284af291e8a8f9c04efb1b9b8d0bbdb422dd325a6fd6563faf5e33665e02
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
172 B
575 B
|
144ms
103ms
|
XHR
application/json |
34.95.120.147
GOOGLE
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=86029a2c-6ee4-47da-a15d-bb2f2ac2f93f&nocache=1584389315812&aus=300x250&divIds=rectangle&auid=539417461&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.179.0 /
- Resource Hash
- f54aa2c65627448abac09eb4845cc746f9a21a83a69d930b28b750df2dca73b6
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
24 B
994 B
|
205ms
165ms
|
XHR
application/json |
92.122.254.129
AKAMAI-AS
|
|
General
- Full URL
- https://as-sec.casalemedia.com/cygnus?s=341871&v=7.2&r=%7B%22id%22%3A%223ef18fd968906b%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2249c51eb3dea758%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22341871%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2254a6d02b3cefbe%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2269784c586efb8c%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2273c2be9c384804%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%22863fe3f90a28c1%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2294790d0308a532%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2210fc1229b0f9a86%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346699%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%221108c403668d4e3%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A180%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346699%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%2212e7ce8c2631b93%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346699%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%221315ef2df5cbaa1%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346699%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22144bae85731ebb6%22%2C%22banner%22%3A%7B%22w%22%3A770%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346699%22%2C%22sid%22%3A%224%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
92.122.254.129
, Ascension Island,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a92-122-254-129.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- 1261681dc554639577db178c8786ae40a6c72732d892308c7eabbe798872a0fc
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
160ms
70ms
|
XHR
application/json |
185.86.139.58
SMARTADSERVER
|
|
|
GET
H/1.1
|
200
OK
|
9817382,9777712,9817385
Show response
ad.yieldlab.net/yp/
|
2 B
770 B
|
194ms
80ms
|
XHR
application/json |
23.61.243.29
AKAMAI-AS
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
378 B
1 KB
|
80ms
42ms
|
XHR
application/json |
185.33.223.80
ASN-APPNEX
|
|
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
121 B
|
147ms
106ms
|
XHR
text/plain |
185.64.189.112
AS-PUBMATIC
|
|
|
OPTIONS
H2
|
204
|
v1
Show response
dmx.districtm.io/b/
|
0
468 B
|
80ms
37ms
|
XHR
text/plain |
104.16.68.69
CLOUDFLARENET
|
|
General
- Full URL
- https://dmx.districtm.io/b/v1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.68.69
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
19 B
719 B
|
61ms
22ms
|
XHR
application/json |
185.33.223.80
ASN-APPNEX
|
|
|
POST
H2
|
204
|
cdb
Show response
bidder.criteo.com/
|
0
152 B
|
86ms
27ms
|
XHR
text/plain |
178.250.0.165
ASN-CRITEO-EUROPE
|
|
|
POST
H2
|
204
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
49ms
33ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
POST
H2
|
204
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
34ms
21ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2Fbanner,%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2Fsky,%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2F...
Show response
s385.mxcdn.net/679600/
|
985 B
1 KB
|
59ms
19ms
|
XHR
application/json |
92.122.254.186
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
24.gif
stats.computecmedia.de/
|
807 B
2 KB
|
109ms
39ms
|
Image
image/gif |
62.146.104.136
QSC-AG-IPX
|
|
General
- Full URL
- https://stats.computecmedia.de/24.gif?c_pcgh_ArticlePage_TelekommunikationInternetdienste&content=a&tid=1&gid=-1&sid=24&bAdvertorial=false&aAuthor=[6310]&aage=2019-09-12t20-28&ptid=216880,5073&a_icategoryid=-1&aid=1332425&page=1&r=&bax=true&zRnd=20315.417456971874&a_ibanners=1&a_iskyscrapers=1&a_irectangles=3&a_ilayers=1&a_iothers=2&uuid=5e6fdcc33ca2e&cp=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.146.104.136
, Germany,
ASN15598
(QSC-AG-IPX, DE),
- Reverse DNS
- Software
-
Apache/2.4.25 /
- Resource Hash
- 7f1182ed0bcc2206a25585a3d1b49a695b65b5aeb80027d9ebba970c40f9740c
|
GET
H/1.1
|
200
OK
|
submit
lb35.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
120ms
30ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/bb-mx/submit?/hQk4BTAAA/whF2Bo0F0wFz6BvvA33F3uBwjFnhFtlFzoFhyFk3FhyFluBklFvpEQoFvuFltBTlFypFltBTtFhyF0wFovFulFtyAx2A44AwvAOlF3zFvxAxtAQyFvtB1uFktBNhF4tBElF0hFpsFztBBrFr1FtLEhwFh6Fp0FhlF0tBSBFNtBxzAzyA0yA1vAfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSMMBPAAAAAAAAAOAAAAGBAAAAAAZwSMMBBRksFAQtjF8b/HTA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
127ms
27ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
138ms
45ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43099:uniques_instantly[domain:www.pcgameshardware.de,url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,page:iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,reference_time:84,article_layout:default,category:news,type_article:shortread,pub_date:12%20Sep%202019%2020%3A28%3A00%20CEST,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:aa0c4043a.f9d2c0cfb_1584389315604,session_id:924fa9a7a.cc487ad52_1584389315919,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&1584389315924
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Finland,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
181ms
46ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43099:visits_instantly[domain:www.pcgameshardware.de,url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,page:iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,reference_time:84,article_layout:default,category:news,type_article:shortread,pub_date:12%20Sep%202019%2020%3A28%3A00%20CEST,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:aa0c4043a.f9d2c0cfb_1584389315604,session_id:924fa9a7a.cc487ad52_1584389315919,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&__io=aa0c4043a.f9d2c0cfb_1584389315604&1584389315927
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Finland,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
225ms
46ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43099:pageviews[domain:www.pcgameshardware.de,url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,page:iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,reference_time:84,article_layout:default,category:news,type_article:shortread,pub_date:12%20Sep%202019%2020%3A28%3A00%20CEST,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:aa0c4043a.f9d2c0cfb_1584389315604,session_id:924fa9a7a.cc487ad52_1584389315919,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&1584389315930
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Finland,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
CIqNVwv8_BFDDDECE.png
www.pcgameshardware.de/screenshots/380x214/2015/
|
68 B
241 B
|
66ms
65ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/380x214/2015/CIqNVwv8_BFDDDECE.png
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
AdDefend GmbH
- Resource Hash
- adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
nuggad
ih.adscale.de/
|
49 B
278 B
|
314ms
20ms
|
Image
image/gif |
18.185.150.7
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
3477ms
65ms
|
Script
application/javascript |
23.60.16.116
AKAMAI-AS
|
|
|
POST
|
|
v1
dmx.districtm.io/b/
|
0
0
|
|
|
|
|
|
GET
H2
|
200
|
lato-v16-latin-ext-400.woff
player.pcgameshardware.de/fonts/
Frame FABB
|
30 KB
30 KB
|
23ms
22ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://player.pcgameshardware.de/fonts/lato-v16-latin-ext-400.woff
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 8badcd604652360c68c0677ba0772d2973f2cfe293b5679fec3d1d63018d396e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
lato-v16-latin-ext-700.woff
player.pcgameshardware.de/fonts/
Frame FABB
|
30 KB
30 KB
|
18ms
17ms
|
Font
application/font-woff |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://player.pcgameshardware.de/fonts/lato-v16-latin-ext-700.woff
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 66bdd962ad3c4a394964e44600d43808fc3377e3323e00c86213c2564aae5651
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
204
No Content
|
b2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=h...
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=...
|
0
248 B
|
25ms
25ms
|
Image
text/plain |
23.11.238.95
AKAMAI-AS
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&c9=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.11.238.95
, United States,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a23-11-238-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
Frame FABB
|
24 KB
9 KB
|
29ms
28ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
General
- Full URL
- https://script.ioam.de/iam.js?m=1
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.103.64
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- script3.ioam.de
- Software
-
nginx /
BLACKBIRD-SRC v0.13 000f
- Resource Hash
- 09381e339f76cfa3c58589485e77387d5f049ae28890da3d65af3c671fd6ee81
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame FABB
|
264 KB
90 KB
|
42ms
40ms
|
Script
text/javascript |
2a00:1450:4001:80b::200a
GOOGLE
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/sdkloader/ima3.js
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f34922bc830fe07b84412052407d933809cf522f9ba778b2511fe7575a0e3486
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
video.full.min.css
player.pcgameshardware.de/dist/
Frame FABB
|
84 KB
29 KB
|
23ms
22ms
|
Stylesheet
text/css |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://player.pcgameshardware.de/dist/video.full.min.css?v=d2d8535c8ac6d2e13637065718340766
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 2183bad6dcd8943484d95863256716aaabc71e3da28f52be9d07f4b9c4f0fc62
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
video.full.min.js
Show response
player.pcgameshardware.de/dist/
Frame FABB
|
653 KB
160 KB
|
32ms
31ms
|
Script
application/javascript |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- c163ef1dca570a8e257a43d5bf848bee6876ec870822246f2f3f65fb62b3496b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
200
OK
|
I99SivONLxYO
Show response
cdn.onthe.io/io.js/
Frame FABB
|
74 KB
28 KB
|
42ms
41ms
|
Script
text/javascript |
116.203.211.59
HETZNER-AS
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
25 KB
6 KB
|
387ms
387ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C728x90%7C728x180%7C31x31%2C10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31%2C10x20%7C10x10%7C300x250%7C300x601%7C34x31&prev_scp=as%3Dbanner%26adslot%3Dbanner%26af%3Dds%2Cbri%2Cf2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cstbb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cvto%26pc%3D1%26yieldlove_reload%3Dpid%253A9559.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9559.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9559.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9559.sb%253Af%26yieldlove_pid%3D9559%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%7Cas%3Dsky%26adslot%3Dsky%26af%3Dfirepl%2Cwp%2Cvidwa%2Cbri%2Cf1x4%2Cf1x3%2Cf1x2%2Cds%2Cdds%2Csky%2Chpad%2Cband%26rfree%3D400-499%26pc%3D1%26yieldlove_reload%3Dpid%253A9560.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9560.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9560.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9560.sb%253Af%26yieldlove_pid%3D9560%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26mtrcskv%3D100-1_75%2C50-1_75%2C50-1_100%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26yieldlove_reload%3Dpid%253A9589.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9589.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9589.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9589.sb%253Af%26yieldlove_pid%3D9589%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26mtrcskv%3D100-1_75%2C50-1_75%2C50-1_100%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26af%3Df1x2%2Cf1x1%2Cmrec&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple&cookie_enabled=1&bc=31&abxe=1&lmt=1584389315&dt=1584389315974&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=653%2C1173%2C993&adys=120%2C220%2C247&adks=2479418200%2C3511023609%2C3888641151&ucis=1%7C2%7C3&ifi=1&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=62&icsg=273837762623&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1020x10%7C10x40%7C300x20&msz=1020x10%7C10x40%7C300x20&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4%2C4%2C4&ohw=1585%2C1585%2C1585
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 95089852f486979770ba35460afa6ef9392b6fc143a31c804fb703075d465661
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020030501.js
Show response
securepubads.g.doubleclick.net/gpt/
|
69 KB
25 KB
|
32ms
32ms
|
Script
text/javascript |
216.58.206.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:81c::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
70ms
24ms
|
XHR
application/javascript |
143.204.201.153
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
36 KB
9 KB
|
324ms
26ms
|
Script
text/javascript |
151.101.13.194
FASTLY
|
|
|
GET
H2
|
200
|
pmk-202002191.4.js
Show response
widget.perfectmarket.com/stroeer-computec-pcgameshardwarede/
|
111 KB
31 KB
|
27ms
26ms
|
Script
application/javascript |
151.101.113.181
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
Frame FABB
|
53 B
714 B
|
444ms
130ms
|
XHR
application/json |
52.216.178.5
AMAZON-02
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.216.178.5
Ashburn, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- s3-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H2
|
200
|
homadConfigJson.cfm
Show response
player.pcgameshardware.de/app/
Frame FABB
|
334 B
264 B
|
61ms
60ms
|
XHR
application/json |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://player.pcgameshardware.de/app/homadConfigJson.cfm
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 606dd07fdfe7b4f1440a8be46195687a04a21435a9691a7ba496759139f4ce78
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
CIqNVwv8_FCDEBBFC.jpg
www.pcgameshardware.de/screenshots/147x110/2018/adinclude/
|
68 B
157 B
|
54ms
54ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/147x110/2018/adinclude/CIqNVwv8_FCDEBBFC.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
AdDefend GmbH
- Resource Hash
- adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H2
|
200
|
CIqNVwv8_BCBBDCCC.jpg
www.pcgameshardware.de/screenshots/74x96/2010/adinclude/
|
68 B
129 B
|
55ms
55ms
|
Image
image/png |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://www.pcgameshardware.de/screenshots/74x96/2010/adinclude/CIqNVwv8_BCBBDCCC.jpg
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
AdDefend GmbH
- Resource Hash
- adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
200
OK
|
81933.jpg
icdn.computec.de/videos/img/medium/2019/9/
Frame FABB
|
106 KB
106 KB
|
30ms
30ms
|
Image
image/jpeg |
62.146.104.136
QSC-AG-IPX
|
|
General
- Full URL
- https://icdn.computec.de/videos/img/medium/2019/9/81933.jpg?t=1568221080
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.146.104.136
, Germany,
ASN15598
(QSC-AG-IPX, DE),
- Reverse DNS
- Software
-
Apache/2.4.25 /
- Resource Hash
- 03ca4c0ca6ea501c4138d0e85e7d32b1d8878462b24317a1a020b040009fc81b
|
GET
BLOB
|
200
OK
|
c0b84014-add6-4cf1-a366-402d2918eead
https://player.pcgameshardware.de/
Frame FABB
|
31 B
0
|
|
Other
application/javascript |
|
|
General
- Full URL
- blob:https://player.pcgameshardware.de/c0b84014-add6-4cf1-a366-402d2918eead
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766
- Protocol
- BLOB
- Server
-
-, ,
ASN
(),
- Reverse DNS
- Software
-
/
- Resource Hash
- 7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
Frame FABB
|
44 KB
18 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:814::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
DATA
|
200
OK
|
truncated
/
Frame FABB
|
720 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.pcgameshardware.de/
Frame FABB
|
379 B
1 KB
|
341ms
24ms
|
XHR
application/json |
13.224.194.65
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.pcgameshardware.de/config.json
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.194.65
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-224-194-65.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 639feb879746e27c7d840e578e49c0da546a3ad6c16851b8d1bfe085d8f50a37
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
64ms
45ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
beacon.js
Show response
sb.scorecardresearch.com/
|
1 KB
1 KB
|
24ms
23ms
|
Script
application/x-javascript |
23.11.238.95
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/202003161204/
|
32 KB
13 KB
|
24ms
23ms
|
Script
application/javascript |
151.101.13.194
FASTLY
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/202003161204/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 2bce7831bf8bbc8f8768b7f73e529f4957146e9ab42d442070aa5333df1d2f8f
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 3797
|
0
0
|
36ms
35ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssGqqt66R8V17pEZR1XY9FsIYxhtwNNspX-WX_1ffGyfvHtsvJGFIIEigBo41ai9pguFFTR0a-6y5kvm1bVeRa-bVV9ULp2DHGeNfF5D-6vSeg3_EZ0-vSA89W8TP1bBT4WN3SoOUaK05uPy8hQn_iijSdd47vMK_MQvtmJZF2Zv3BlA2GgN7qUrlNtFC_6xyFCRtup86a3tfTs9-Ztm2aNHXZW4ODaUITuUV7Y4Rz4tkIo1xujjTmW4Sr23kyARvdlQrIoGhLeD-z8Qpqylckh9GHowMGGolreqhIIcjcMkmC_Q9Znc552GrDUsvdDybOHk2whJLUz_aW09Q&sai=AMfl-YRORKCVshXqnl5BISwVe_Nk-r2bvw-8bZNaBCOp5buNholvQdNZXkYDR5QxsknAnbErD-dpgsRnjFWKa7Oi5KckVT_dGYy5HIL0eNo0&sig=Cg0ArKJSzKTRXmXgvH8iEAE&urlfix=1&adurl=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
itfudnuj.js
Show response
ad4m.at/
Frame 3797
|
48 KB
15 KB
|
75ms
19ms
|
Script
application/javascript |
35.190.94.1
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 3797
|
73 KB
28 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
73 KB
27 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 909009056877bdbc198a45c7adec7d4b0615aa97d0a4d61ac493472dd0b4a97f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame C870
|
0
0
|
34ms
34ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstiWrjq5PVbpI1mAXkGreSB6faIeaxw-9dVmJ_feta_jGPx2qVIAZ_yHGURCVNnPsL6ARkgi8w6CtJ56qah_AX0DF4UvK_fGhsgN42jap8awzNQTQPMqcRMyi9Aq_5TfiTeB7kDzptsdX_qiHzZwiD3L4OzCqFKEui5TcgeESrkF5SCmURiOLDl7-XYLaaj2doQNK3YLR0cUpVDMFxTCkLyPzLAK8h3KvStYeQylzkP2cU0VQvLPLsi_M9D3gu9aTQqCX2If31gfyVWXAgUQ6ex5fG-CbYIwFZ5BsruFO-sjHLUkFIf6XR0zr3eOjZP8fUx7N4WjK7igjiOGcIl-w&sai=AMfl-YQXXRxj1D6Wgo42Qr6P2fFBhvzQLPGYGU6hV9mTp71sMkzZeoj-EnPOXxTAhEC1UkLB1r4sAF1ZwTabdH6k2HPsUyXXy1bJBS2_qpvB&sig=Cg0ArKJSzCW8znRydy4UEAE&urlfix=1&adurl=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
itfudnuj.js
Show response
ad4m.at/
Frame C870
|
48 KB
14 KB
|
83ms
32ms
|
Script
application/javascript |
35.190.94.1
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame C870
|
73 KB
28 KB
|
19ms
19ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 0E79
|
0
0
|
36ms
35ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsub0cgU-5IQ0HrHSqb4ueQP_ETdKpdl2A3Ebp1dL6Ia5gsWDtvcWuhlYZozzXA2GIKYJOO1fURk2WBItTq-ax4rWzXgePP6uext45Of12cBUGSPyE_6-OoIgRf1DaTBH1SoLG2m0k40EsEAkZDMEk1OU-Bt9tIarRV8cWO13ork5wU0rM2aTZcn-Ry1M_xncBaCENJ0qzuZLh13dSPxJZnlIKQka82yfdgp5F0OZxj8LWF04ysGb5t0wSA7mrX7jhAUso0-1aH_1UM2Ll5BtdZYx1weKVKJcWvS-JqmHBvSsn6U0Pg7GXfsJPmb3JxSQEXLMvMbFY9dbQEPGw&sai=AMfl-YQvbJU-3CnSrwnjasgw3UrGEKBBQ8E1q5aW0jo58MUiikrSueoF3Nt_h7nN8WUPG8opX2uVwGkO6ogwRSWcxgCOXz8uU4O9-nxUqUMD&sig=Cg0ArKJSzBZzpWoGX3TrEAE&urlfix=1&adurl=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
itfudnuj.js
Show response
ad4m.at/
Frame 0E79
|
48 KB
14 KB
|
84ms
37ms
|
Script
application/javascript |
35.190.94.1
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 0E79
|
73 KB
28 KB
|
46ms
45ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
21ms
21ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
24ms
24ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
21ms
20ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame FABB
|
202 KB
59 KB
|
21ms
21ms
|
XHR
application/javascript |
13.224.194.65
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=GnqUzphtkk
- Requested by
- Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.194.65
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-224-194-65.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 097ebd02792cbac7d27830cd9af71b8257add220e67c7281d705dcd30b8e71d3
|
GET
DATA
|
200
OK
|
truncated
/
Frame 3797
|
213 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
frame.html
ad4m.at/
Frame 293C
|
0
0
|
20ms
20ms
|
Document
text/html |
35.190.94.1
GOOGLE
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame C870
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
30ms
29ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4DIKAAKktFLkqFFlqwF23A52AwwA/k0FzEmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwBELlnFBUkzFkBP5JAAAAAAABcBBAPAAAFAAcBBTYeNAPBAArEA4BABYeNAZAAAOA55A55A85B55A58E55A55AEA0xA44ArYeNAPGAArEA4BAHYeNASksFRGjAAAAAAAAAAAAEAAAcBBAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFGA3yA44E5wAMAxzA4yA44A23Ax0A3yAGAkpFylFj0FAAAAIAy5A53A21Az1AKA1zAyxA03Aw3A2yAGAihFuuFlyFKA1zAyxA03Aw3A2yAKA1zAyxA03Aw3A2yAEBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEihFuuFlyFdrEA4BAYLAaBAFAAAYeNAAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFW+qwUA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
DATA
|
200
OK
|
truncated
/
Frame 0E79
|
213 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
71ms
71ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2&prev_iu_szs=1x1&ists=1&prev_scp=as%3Dout_of_page%26adslot%3Dout_of_page%26af%3Dds%2Ctickerad%2Cfloor%26pc%3D1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple%26amznbid%3D0%26amznp%3D0&cookie=ID%3D6701f103358bdb94%3AT%3D1584389316%3AS%3DALNI_MbkE-UHaWss7PQub3pbI_LukamabQ&cookie_enabled=1&bc=31&abxe=1&lmt=1584389316&dt=1584389316519&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=0&adys=4876&adks=2955490964&ucis=4&ifi=2&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=68&icsg=4381404201023&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x1&msz=1585x1&psts=ABP-KfQx5sZ54QH7nZ8QijWTYaaWVoDRWn__xCnnoW4LbloI47YieDSL6MyQFwKAPZU6Qtz9-cJvxzdxD7VdImXTRJ_Gu54%2CABP-KfSbv5qXKpj9gGOVWmLri24SykRtJmyO_2QPhn_oWScD2bzlawrbTikb-a8UYVxJyc0igwhZdFynDvdFCncwFNgOsF8%2CABP-KfQc6HT2hCPBbte_qwxvnHOzbVbLrUYMu5xrCfyiLc1_lrcXC6wZV7BXtgvM78tAFksEQ-FU5sSfvnq9GMEhpbqdbQo&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4&ohw=1585
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 39a86f48eccafc70cd5f72113fa46299fcf2d56af9faeb456ab2809576dbf830
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
3 KB
|
358ms
357ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2&prev_iu_szs=970x255%7C36x31&prev_scp=as%3Dpubperform%26adslot%3Dpubperform%26pc%3D1%26af%3Dpubperf&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple%26amznbid%3D0%26amznp%3D0&cookie=ID%3D6701f103358bdb94%3AT%3D1584389316%3AS%3DALNI_MbkE-UHaWss7PQub3pbI_LukamabQ&cookie_enabled=1&bc=31&abxe=1&lmt=1584389316&dt=1584389316528&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=163&adys=4579&adks=2951885302&ucis=5&ifi=3&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=68&icsg=4381404201023&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x255&msz=1000x255&psts=ABP-KfQx5sZ54QH7nZ8QijWTYaaWVoDRWn__xCnnoW4LbloI47YieDSL6MyQFwKAPZU6Qtz9-cJvxzdxD7VdImXTRJ_Gu54%2CABP-KfSbv5qXKpj9gGOVWmLri24SykRtJmyO_2QPhn_oWScD2bzlawrbTikb-a8UYVxJyc0igwhZdFynDvdFCncwFNgOsF8%2CABP-KfQc6HT2hCPBbte_qwxvnHOzbVbLrUYMu5xrCfyiLc1_lrcXC6wZV7BXtgvM78tAFksEQ-FU5sSfvnq9GMEhpbqdbQo&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4&ohw=1585
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 66c1574ab1ccc629d6a086611d3676570ac92c044f97433ced8c1937d1f60b92
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
13 KB
5 KB
|
2471ms
2469ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2&prev_iu_szs=800x450%7C580x500%7C580x360%7C480x360%7C42x31&prev_scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple%26amznbid%3D0%26amznp%3D0&cookie=ID%3D6701f103358bdb94%3AT%3D1584389316%3AS%3DALNI_MbkE-UHaWss7PQub3pbI_LukamabQ&cookie_enabled=1&bc=31&abxe=1&lmt=1584389316&dt=1584389316534&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=193&adys=1212&adks=3981034135&ucis=6&ifi=4&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=68&icsg=4381404201023&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=610x450&msz=610x450&psts=ABP-KfQx5sZ54QH7nZ8QijWTYaaWVoDRWn__xCnnoW4LbloI47YieDSL6MyQFwKAPZU6Qtz9-cJvxzdxD7VdImXTRJ_Gu54%2CABP-KfSbv5qXKpj9gGOVWmLri24SykRtJmyO_2QPhn_oWScD2bzlawrbTikb-a8UYVxJyc0igwhZdFynDvdFCncwFNgOsF8%2CABP-KfQc6HT2hCPBbte_qwxvnHOzbVbLrUYMu5xrCfyiLc1_lrcXC6wZV7BXtgvM78tAFksEQ-FU5sSfvnq9GMEhpbqdbQo&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4&ohw=1585
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b568c9877ce52d0ae234a0e6c9dbdb4cf3d415c16b2ab387b0cbaeca91b5c0a3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
29ms
28ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4EPKAA/k0FkJmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1ALlnFCUkzFYBPIAAAAAAAABirJAPAAAFAAirJTl5/APAAAVSAwDABl5/AZAAAOA55A55A85B55A58E55A55AFAz5A21AwBErl5/ASksFRGjAAAAAAAAAAAAEAAAirJAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHAxyAw4E2wAwBEMAxzA4yA45Aw0AwxAy4AGAkpFylFj0FAAAAIAy5A53A21Az1AKA1zAyxA03Aw3A2yADAzrF5BFKA1zAyxA03Aw3A2yAKA1zAyxA03Aw3A2yABBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEzrF5BFdVSAwDAgCAYJAFAAAl5/AAAAAOATrF5zFjyFhwFlyFfxB2wAAAAAAAAAAAAAAAAAQtjFkZAZXA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
28ms
27ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4FQKAA/k0FiOmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyALlnFDTkzFARksFAQtjF7BcgXA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
frame.html
ad4m.at/
Frame 134C
|
0
0
|
19ms
19ms
|
Document
text/html |
35.190.94.1
GOOGLE
|
|
|
GET
H2
|
200
|
frame.html
ad4m.at/
Frame 343F
|
0
0
|
19ms
19ms
|
Document
text/html |
35.190.94.1
GOOGLE
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame FABB
|
202 KB
0
|
|
Script
text/javascript |
|
|
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
65 B
|
130ms
129ms
|
XHR
text/plain |
185.64.189.112
AS-PUBMATIC
|
|
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
25 B
1 KB
|
335ms
334ms
|
XHR
application/json |
92.122.254.129
AKAMAI-AS
|
|
General
- Full URL
- https://as-sec.casalemedia.com/cygnus?s=346697&v=7.2&r=%7B%22id%22%3A%22572cd35d6f0fd74%22%2C%22imp%22%3A%5B%7B%22id%22%3A%225844216049fda93%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346697%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%22598a29c9c5b7811%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22388778%22%2C%22sid%22%3A%228%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
92.122.254.129
, Ascension Island,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a92-122-254-129.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- 7e5ab895bb5694aa8324f1553297cf4d4e079acd65ec72c38cccf9f19c45a64e
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
240 B
2 KB
|
200ms
114ms
|
XHR
application/json |
69.173.144.140
RUBICONPROJECT
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=158344&zone_id=850900&size_id=15&p_pos=btf&rf=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=eea9e32b-3d82-4bf9-a77d-b87805d72f1c&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.6101806026639982
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.140
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT, US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- d39185735f23604dc068be3e0672d570685eac008d5daa49f686028f5a1228dc
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
240 B
2 KB
|
199ms
109ms
|
XHR
application/json |
69.173.144.140
RUBICONPROJECT
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=158344&zone_id=850902&size_id=15&p_pos=btf&rf=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=8da0f59e-cb32-49da-9ab0-ce6008393105&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.3991236792107995
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.140
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT, US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- bd78ffb515d3ae83fe62aab4955639a42447ead2e3efbb765fc2724e57ce59ed
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
128ms
127ms
|
XHR
application/json |
185.86.139.58
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
19 B
875 B
|
38ms
38ms
|
XHR
application/json |
185.33.223.80
ASN-APPNEX
|
|
|
POST
H2
|
204
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
43ms
43ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
14 KB
4 KB
|
2398ms
2398ms
|
XHR
text/plain |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x10%7C301x250%7C34x32%2C10x10%7C302x250%7C34x33&prev_scp=as%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26yieldlove_reload%3Dpid%253A11469.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A11469.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A11469.scenario%253Adefault%26yieldlove_meta%3Dpid%253A11469.sb%253Af%26yieldlove_pid%3D11469%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df1x1%2Cmrec%7Cas%3Drectangle3%26adslot%3Drectangle3%26pc%3D1%26yieldlove_reload%3Dpid%253A11470.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A11470.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A11470.scenario%253Adefault%26yieldlove_meta%3Dpid%253A11470.sb%253Af%26yieldlove_pid%3D11470%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle3%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple%26amznbid%3D0%26amznp%3D0&cookie=ID%3D6701f103358bdb94%3AT%3D1584389316%3AS%3DALNI_MbkE-UHaWss7PQub3pbI_LukamabQ&cookie_enabled=1&bc=31&abxe=1&lmt=1584389316&dt=1584389316606&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=993%2C993&adys=1367%2C2917&adks=2466507506%2C2973274926&ucis=7%7C8&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=68&icsg=4381404201023&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x10%7C300x10&msz=300x10%7C300x10&psts=ABP-KfQx5sZ54QH7nZ8QijWTYaaWVoDRWn__xCnnoW4LbloI47YieDSL6MyQFwKAPZU6Qtz9-cJvxzdxD7VdImXTRJ_Gu54%2CABP-KfSbv5qXKpj9gGOVWmLri24SykRtJmyO_2QPhn_oWScD2bzlawrbTikb-a8UYVxJyc0igwhZdFynDvdFCncwFNgOsF8%2CABP-KfQc6HT2hCPBbte_qwxvnHOzbVbLrUYMu5xrCfyiLc1_lrcXC6wZV7BXtgvM78tAFksEQ-FU5sSfvnq9GMEhpbqdbQo&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4%2C4&ohw=1585%2C1585
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- ce9a15b7e9192ae68522debd6b860b5278fbca7c6528ad9be09e1cbaa4724597
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
204
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
21ms
21ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame D6F4
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvNv4Q3IYGBcE-i_q68n_uCgOPzjHmob9WfIwEZ1hJDR9SoysVJA38hKCCuSP9DE4GzZ8vsfOzDTpVWhMSgon1ZDITYSv3-5RCMniVUKlKsVUKWm_R9p_plZ6HYlFonEfQKnZeD6b5kv...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
12ms
11ms
|
Image
image/gif |
2a02:26f0:10:28e::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
frame.html
ad4mat.net/
Frame 71E7
|
0
0
|
93ms
24ms
|
Document
text/html |
146.148.127.183
GOOGLE
|
|
|
GET
H2
|
200
|
frame.html
ad4mat.net/
Frame 6741
|
0
0
|
90ms
26ms
|
Document
text/html |
146.148.127.183
GOOGLE
|
|
|
GET
H2
|
200
|
frame.html
ad4mat.net/
Frame 959F
|
0
0
|
88ms
25ms
|
Document
text/html |
146.148.127.183
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
28ms
27ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4GNNAAUkzFYBPHAAAAAAAABaLeAPAAAFAAaLeTbosAPBAAQNALEABbosAZAAAOA55A55A85B55A58E55A55AGAxyAz2AxwArbosASksFmGjAAAAAAAAAAAAEAAAaLeAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA44A3zA43AwxAGAkpFylFj0FAAAAIAy5A53A21Az1AKA1zAyxA03Aw3A2yAJAylFj0FhuFnsFlBFKA1zAyxA03Aw3A2yAKA1zAyxA03Aw3A2yAHBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlBFdQNALEAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF+AE6SA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
28ms
27ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4HONAA/k0FYTmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF95A32A2wA3zA1mAjpFk9BxzA4yAz5Ax3A3wAzwAmzEp6Fl9Bx4ExmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF95A32A2wA3zA1mAhwFk9B53A22Aw3Az1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA23AwyATkzFARksFAQtjF0HgcbA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
rar
ad4m.at/ad/
Frame E620
Redirect Chain
-
https://ad4m.at/rs?a=&b=40&c=680&d=&e=728&f=90&g=0&h=Stroeer_RON_728x90&i=&j=1065&k=1&l=&m=&n=&o=0&p=0
-
https://ad4m.at/ad/rar?a=15255%2C11198%2C15573&b=oneidMpmUzfrf1zRuWHEHGtDt2jpCkC4oneid__asuid0asuid__Stroeer_RON_728x90%2ConeidzK4SRfYfedYSpHBHMtqtz21UXCwoneid__asuid0asuid__Stroeer_RON_728x90%2Con...
|
0
0
|
35ms
35ms
|
Document
text/html |
35.190.94.1
GOOGLE
|
|
General
- Full URL
- https://ad4m.at/ad/rar?a=15255%2C11198%2C15573&b=oneidMpmUzfrf1zRuWHEHGtDt2jpCkC4oneid__asuid0asuid__Stroeer_RON_728x90%2ConeidzK4SRfYfedYSpHBHMtqtz21UXCwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidPXJaBfbfDEQF9HjHbtMtK7xCYC9oneid__asuid0asuid__Stroeer_RON_728x90&f=oneid6k4aef3f6wmheHmHYtEC5kmtMC1oneid__asuid0asuid__Stroeer_RON_728x90%2Coneid8gQhDf8fk8qhgHJHEtqCkEdfACwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidbzwSQfZfeDVaYHbHzt8C1d8fjCJoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=79b1afd827e3c037ebcda3728b628391%2F2146759660757302036&i=25174%2C20535%2C26474&j=16%2C16%2C41&k=0&l=0&m=0&n=&y=1&z=0
- Requested by
- Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
35.190.94.1
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- 1.94.190.35.bc.googleusercontent.com
- Software
-
nginx /
- Resource Hash
- Security Headers
-
Name |
Value |
Content-Security-Policy |
block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox |
Strict-Transport-Security |
max-age=86400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
rar
ad4m.at/ad/
Frame A2A7
Redirect Chain
-
https://ad4m.at/rs?a=&b=39&c=680&d=&e=300&f=250&g=0&h=Stroeer_RON_300x250&i=&j=1065&k=1&l=&m=&n=&o=0&p=0
-
https://ad4m.at/ad/rar?a=13525&b=oneidzK4SRfYf9RMapHBH8uqtzrQsXCwoneid__asuid0asuid__Stroeer_RON_300x250&f=oneid8gQhDf8fZ2zHgHJH3uqCkMKHACwoneid__asuid0asuid__Stroeer_RON_300x250&c=300&d=250&e=&g=9...
|
0
0
|
38ms
37ms
|
Document
text/html |
35.190.94.1
GOOGLE
|
|
General
- Full URL
- https://ad4m.at/ad/rar?a=13525&b=oneidzK4SRfYf9RMapHBH8uqtzrQsXCwoneid__asuid0asuid__Stroeer_RON_300x250&f=oneid8gQhDf8fZ2zHgHJH3uqCkMKHACwoneid__asuid0asuid__Stroeer_RON_300x250&c=300&d=250&e=&g=97c231bad278c0aef7dc64f85de5fc9f%2F6607609293362353383&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
- Requested by
- Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
35.190.94.1
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- 1.94.190.35.bc.googleusercontent.com
- Software
-
nginx /
- Resource Hash
- Security Headers
-
Name |
Value |
Content-Security-Policy |
block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox |
Strict-Transport-Security |
max-age=86400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
rar
ad4m.at/ad/
Frame F07A
Redirect Chain
-
https://ad4m.at/rs?a=&b=38&c=680&d=&e=160&f=600&g=0&h=Stroeer_RON_160x600&i=&j=1065&k=1&l=&m=&n=&o=0&p=0
-
https://ad4m.at/ad/rar?a=13516&b=oneidxRPFQfAfb3RSPHdH9uQtREQC1C6oneid__asuid0asuid__Stroeer_RON_160x600&f=oneidYz2Srf3f9YGtVH9H6ugCR5ZCQC1oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=7...
|
0
0
|
36ms
35ms
|
Document
text/html |
35.190.94.1
GOOGLE
|
|
General
- Full URL
- https://ad4m.at/ad/rar?a=13516&b=oneidxRPFQfAfb3RSPHdH9uQtREQC1C6oneid__asuid0asuid__Stroeer_RON_160x600&f=oneidYz2Srf3f9YGtVH9H6ugCR5ZCQC1oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=735bd80f6dbf1806ea624eb71cc01fdb%2F9088414369191691710&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
- Requested by
- Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
35.190.94.1
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- 1.94.190.35.bc.googleusercontent.com
- Software
-
nginx /
- Resource Hash
- Security Headers
-
Name |
Value |
Content-Security-Policy |
block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox |
Strict-Transport-Security |
max-age=86400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
publishertag.prebid.js
Show response
static.criteo.net/js/ld/
|
66 KB
21 KB
|
50ms
16ms
|
Script
text/javascript |
2a02:2638::3
ASN-CRITEO-EUROPE
|
|
|
GET
H/1.1
|
200
OK
|
specTr.php
stats.computecmedia.de/
|
0
300 B
|
31ms
30ms
|
Image
text/html |
62.146.104.136
QSC-AG-IPX
|
|
|
GET
H/1.1
|
200
OK
|
specTr.php
stats.computecmedia.de/
|
0
300 B
|
62ms
31ms
|
Image
text/html |
62.146.104.136
QSC-AG-IPX
|
|
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame F616
|
0
0
|
34ms
33ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssSKz4pENWgFeT90tz6xihHB3VAIHlHld0gxBQPpWCm7KnXFFcJQC7plEGi8ds7VvKwHXSSkY4ZxF1f18NAFerqAZVxAIfYt7KbOrX6hnxPVR2-a1zXTJ-6d5-b_ZndF0ju0TDzc4dX7p_AgBgOK3ltm1i0hk0lAZeZdpX3dRPMpf-eZumPHg4XboRsQD1dyPB2uhgG7ooZ2jilFq9Led1mGeKkLa5bwZqdPHxGZDZc6C1or3ZRAwG3bnDqwZPFfRElIN1Q9Xw0lmvXmQl-dzdlUDECKJ-dzbhxc5gbw0MjyPDzoNKRdr1aVi8&sig=Cg0ArKJSzEV_XLcCoQE-EAE&urlfix=1&adurl=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
getads.js
Show response
js.adscale.de/
Frame F616
|
23 KB
8 KB
|
2172ms
58ms
|
Script
text/javascript |
23.60.16.116
AKAMAI-AS
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame F616
|
73 KB
28 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 3797
|
42 B
110 B
|
16ms
16ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstuS_2OJzgJ2psonIgk5yttMZe9dRYwHrfzkhhDzDj6EMm2GJRO5PEcERqvOdWaz_L2k1A9SALUsYfaAzH8W7FQNnAZUmFqYWMmPjWLCTI&sig=Cg0ArKJSzAKCTUfYar9BEAE&adk=2479418200&tt=-1&bs=1585%2C1200&mtos=1007,1007,1007,1007,1007&tos=1007,0,0,0,0&p=120,299,210,1027&mcvt=1007&rs=0&ht=0&tfs=134&tls=1141&mc=1<e=0&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1584389316384&dlt&rpt=109&isd=0&msd=0&ext&xdi=0&ps=1660%2C5151&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-6-11-11-0-0-0&tvt=1137&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200313
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame C870
|
42 B
110 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssx_vvGkka1wDPK6OPhU0zLg0oiEQoZyxhhoYCS-NOQo9wFaEkdDLi6rIYnyHiESuBe3HeWvV11VtHDqEzq7jZ3RbWmeSjuRqdGP8bMuOU&sig=Cg0ArKJSzLu2s2y3eISlEAE&adk=3511023609&tt=-1&bs=1585%2C1200&mtos=1008,1008,1008,1008,1008&tos=1008,0,0,0,0&p=240,1173,840,1333&mcvt=1008&rs=0&ht=0&tfs=158&tls=1166&mc=1<e=0&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1584389316389&dlt&rpt=118&isd=0&msd=0&ext&xdi=0&ps=1660%2C5151&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-3-11-11-0-0-0&tvt=1164&is=160%2C600&iframe_loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200313
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 0E79
|
42 B
110 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsserXy4zLa2RcIc0x2Ks_wh87ImpW3LH_cNQ68v6suuXxOfbCpRUttxuvYBrafGWrAv7yb4eEB2diBAlfd1Tqtm3TIbtN7GxDwxCbK0ygA&sig=Cg0ArKJSzJgDUwk7pAoBEAE&adk=3888641151&tt=-1&bs=1585%2C1200&mtos=1007,1007,1007,1007,1007&tos=1007,0,0,0,0&p=267,848,517,1148&mcvt=1007&rs=0&ht=0&tfs=152&tls=1159&mc=1<e=0&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1584389316393&dlt&rpt=144&isd=0&msd=0&ext&xdi=0&ps=1660%2C5151&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1159&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200313
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
Frame FABB
|
53 B
714 B
|
847ms
846ms
|
XHR
application/json |
52.216.178.5
AMAZON-02
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=4293835775
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.216.178.5
Ashburn, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- s3-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H2
|
200
|
homadConfigJson.cfm
Show response
player.pcgameshardware.de/app/
Frame FABB
|
334 B
475 B
|
234ms
233ms
|
XHR
application/json |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
General
- Full URL
- https://player.pcgameshardware.de/app/homadConfigJson.cfm?cache=4753416138
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2606:4700:10::6814:d2f
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 606dd07fdfe7b4f1440a8be46195687a04a21435a9691a7ba496759139f4ce78
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15552000; preload |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.pcgameshardware.de/
Frame FABB
|
379 B
1 KB
|
526ms
525ms
|
XHR
application/json |
13.224.194.65
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.pcgameshardware.de/config.json?cache=9161707566
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.194.65
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-224-194-65.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 639feb879746e27c7d840e578e49c0da546a3ad6c16851b8d1bfe085d8f50a37
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 77A0
|
0
0
|
34ms
34ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvU6RYEDuktOna34RoAk3cg3lU8KLf4YhSTQgEqsNBoBFPAeCYm_wOV4IFhXoiEzpBbgqcbvrEcestOVE_M6yKXLXVrrEUpU2f9ywfxwOiQkFmiA-0uGP_x0aTsAzXoAXPknHUWP8cZlhqv-AnnrDcxjtZchTurcKq8gyX5qPJKOsXMD9H0sX6JYgSwXhgbrmLnEaaEDiEBTn1930vTHMbXqPIzrCh4UUNYgnSK1S1TF021pXdBjfDgsFdX4TC_i4sXTUX9mzjrJx0v2YYdp4k0ezVExjlkGhew9lJ4n0qrm6aty2OCtzHOBoHqftrg9-M&sig=Cg0ArKJSzMeIDSrgf_tAEAE&urlfix=1&adurl=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
video.php
Show response
media.oadts.com/www/delivery/
Frame 77A0
|
108 KB
36 KB
|
134ms
42ms
|
Script
text/javascript |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 77A0
|
73 KB
28 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 4F2C
|
0
0
|
35ms
34ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssbQx3ZLLOdtE3PoIG7pOgN8NGCx4otsHfnnU_6SlT9EAct4jzkjQaeyZ4svvlD_BFF5QNPFulioUbqwWpV9179wBfifFzN2yMMcQxV5A1ajY9Y2iWOOzn1JnZ267RQZQc6ltl9-hxf5cIAPauXMF-HA6zHr4PYDV883-H1OolkwR6p1TyWnUuIdh3VBA-qLpLkI6TvFsMwxViVkwI5vLWH36DnS-H3AZDvACv64H9tJEZ7-xqWmzA0KJYyJfrXidcrpdyXPMvPsNRsdRg-fkC5MxWZPHmGqPaP4JUnZLKLi7Gy386GEZLjv9g&sig=Cg0ArKJSzAtpotZ2TGy6EAE&urlfix=1&adurl=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
getads.js
Show response
js.adscale.de/
Frame 4F2C
|
23 KB
8 KB
|
105ms
59ms
|
Script
text/javascript |
23.60.16.116
AKAMAI-AS
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 4F2C
|
73 KB
28 KB
|
16ms
16ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame BDAB
|
0
0
|
35ms
34ms
|
Fetch
image/gif |
216.58.206.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssvyKLNM_heuVS2FzlO4KN339NvQ-JYA6Chq7rFoOSEsNqqLEl1vt5hg2ZKmKceorqH1cINrV8asX1f5xOcwrAov0Gd2W9lfFLxdmpG0RebBoeB1MQc1VYj4v-0R1u0Dv6Z7Am5wsz0dHT1x31fO1eTvprhmYbHzaWiZRqm2EMIhfxWMxQffqATWPxDubeKaV39ihqj13pzdCuw4hBIQQGcLKn6Ri3LejMzSD320VjJDpRlx-jMDPLw2qmQ_rNEPCLz-AZ4kr2sh0vmDYAm7n5HMgs17myqIdq0JNvefCsa88xp0AWv2L1cgNE&sig=Cg0ArKJSzGcebjco6ozSEAE&urlfix=1&adurl=
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.206.2
Mountain View, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s20-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
getads.js
Show response
js.adscale.de/
Frame BDAB
|
23 KB
8 KB
|
160ms
59ms
|
Script
text/javascript |
23.60.16.116
AKAMAI-AS
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame BDAB
|
73 KB
28 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
4933062463
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
69ms
23ms
|
XHR
application/json |
18.194.21.214
AMAZON-02
|
|
|
GET
H2
|
200
|
4933063195
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
68ms
23ms
|
XHR
application/json |
18.194.21.214
AMAZON-02
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.pcgameshardware.de/cf099a5dff816484aeb01008d8536f011a9ffadd/
Frame FABB
|
379 B
1 KB
|
183ms
81ms
|
XHR
application/json |
144.76.12.56
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.pcgameshardware.de/cf099a5dff816484aeb01008d8536f011a9ffadd/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.12.56
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.56.12.76.144.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 639feb879746e27c7d840e578e49c0da546a3ad6c16851b8d1bfe085d8f50a37
|
GET
DATA
|
200
OK
|
truncated
/
Frame F616
|
207 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
28ms
27ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4IRyAALlnFEUkzFUCP9CAAAAAAAB7HYAPBAAFAA7HYTUOaAPAAAAAAMMBBUOaAZAAAOA55A55A85B55A58E55A55AFA54A4xAxBErUOaAPgBAAAAMMBHUOaAPBAAQNALEAHbosAPAAAVSAwDAHl5/APsEAAAAfQBKUOaASksFaGjAAAAAAAAAAAAEAAA7HYAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFDAx4ExBEMAxzA4yAz5Ax3A3wAzwAGAkpFylFj0FAAAAIAy4A23A51A31AIA53A22Aw3Az1ALAv1F0fFvmFfwFhnFlBFIA53A22Aw3Az1AIA53A22Aw3Az1AJBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEv1F0fFvmFfwFhnFlBFdAAAMMBxYAAAAFAAAUOaAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFNpSCTA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
29ms
29ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4JSyAA/k0FWYmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF95A32A2wA3zA1mAjpFk9BxzA4yAz5Ax3A3wAzwAmzEp6Fl9Bx4ExmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF95A32A2wA3zA1mAhwFk9B53A22Aw3Az1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA23AwyAmvFytFh0FjvFklF9RE1hFspF05FGvFv0FlyFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A14A31Aw5A0mAjpFk9BxzA4yA1zA41A22A55AmzEp6Fl9B53Aw4Ey1A1mAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9wE1iFwlFymFvyFtmBhwFj9B04A41A43A1wA50AmhEwkF90A44A14A31Aw5A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEw1FiwFlyFmvFytFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5wA30ATkzFARksFAQtjFRk4lgA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
impr
Show response
gaa.adscale.de/
Frame F616
|
132 B
368 B
|
180ms
135ms
|
Script
text/javascript |
18.185.214.82
AMAZON-02
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
98ms
98ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
23ms
23ms
|
XHR
text/plain |
52.28.163.206
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.pcgameshardware.de/
Frame FABB
|
24 B
356 B
|
121ms
27ms
|
Script
application/octet-stream |
88.198.59.89
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.pcgameshardware.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
88.198.59.89
Nuremberg, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.88-198-59-89.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame F206
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 77A0
|
43 B
413 B
|
28ms
27ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 77A0
|
43 B
413 B
|
90ms
30ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 77A0
|
43 B
413 B
|
114ms
26ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
avc.php
Show response
media.oadts.com/www/delivery/
Frame 77A0
|
12 KB
13 KB
|
48ms
30ms
|
XHR
application/json |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/avc.php?zoneid=5051&pw=100%25&ph=100%25&msgId=atg9910650679&startmuted=1&cb=0.6790122900330589&loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&autostart=1
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 5ec634d70d5b1e33f924c225ea2a7ab4c9451b1ca4665d7c84e79b4613f6e4c1
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 77A0
|
43 B
413 B
|
107ms
27ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
28ms
27ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4K01AALlnFFUkzF2BP3eAAAAAAABdyJAPAAAFAAdyJTCDTAPAAAjCA6HBBCDTAZAAAOA55A55A85B55A58E55A55AFA0wAw5AzBErCDTAPFCAjCA6HBHCDTAPAAAAAAiQBKUOaASksFjGjAAAAAAAAAAAAEAAAdyJAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHA53Aw4Ey1A1BEMAxzA4yA1zA41A22A55AGAkpFylFj0FAAAAIAy4AxyA11Az1AKA04A41A43A1wA50AKAw1FiwFlyFmvFytFKA04A41A43A1wA50AKA04A41A43A1wA50AIBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEw1FiwFlyFmvFytFdjCA6HBKPA/DAFAAACDTAAAAANAR1FhsFp0F5GFvvF0lFyBFAAAAAAAAAAAAAAAAQtjFSdu9SA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
30ms
29ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4L11AA/k0FWdmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF95A32A2wA3zA1mAjpFk9BxzA4yAz5Ax3A3wAzwAmzEp6Fl9Bx4ExmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF95A32A2wA3zA1mAhwFk9B53A22Aw3Az1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA23AwyAmvFytFh0FjvFklF9RE1hFspF05FGvFv0FlyFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A14A31Aw5A0mAjpFk9BxzA4yA1zA41A22A55AmzEp6Fl9B53Aw4Ey1A1mAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9wE1iFwlFymFvyFtmBhwFj9B04A41A43A1wA50AmhEwkF90A44A14A31Aw5A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEw1FiwFlyFmvFytFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5wA30AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zAzwA2yA02AzmAjpFk9BxzA4yA20Az0Aw4AywAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFymAhwFj9B05AzzAw2Ay0A2zAmhEwkF90A5zAzwA2yA02AzmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlyBmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5zAwwATkzFARksFAQtjFZfOKnA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
DATA
|
200
OK
|
truncated
/
Frame BDAB
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
47ms
27ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4M91AALlnFGUkzFYBPdBAAAAAAABerGAPAAAFAAerGTPhsAPAAAAAAAAABPhsAZBAAOA55A55A85B55A58E55A55AFAy3Az1A4BErPhsASksFmGjAAAAAAAAAAAAEAAAerGAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA20Az0Aw4AywAGAkpFylFj0FAAAAIAy4AxyA11Az1AKA05AzzAw2Ay0A2zAKAylFj0FhuFnsFlyBKA05AzzAw2Ay0A2zAKA05AzzAw2Ay0A2zAIBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlyBdAAAAAAAAAAAAFAAAPhsAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFyt+6SA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
50ms
28ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4N91AA/k0FWimvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF95A32A2wA3zA1mAjpFk9BxzA4yAz5Ax3A3wAzwAmzEp6Fl9Bx4ExmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF95A32A2wA3zA1mAhwFk9B53A22Aw3Az1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA23AwyAmvFytFh0FjvFklF9RE1hFspF05FGvFv0FlyFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A14A31Aw5A0mAjpFk9BxzA4yA1zA41A22A55AmzEp6Fl9B53Aw4Ey1A1mAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9wE1iFwlFymFvyFtmBhwFj9B04A41A43A1wA50AmhEwkF90A44A14A31Aw5A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEw1FiwFlyFmvFytFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5wA30AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zAzwA2yA02AzmAjpFk9BxzA4yA20Az0Aw4AywAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFymAhwFj9B05AzzAw2Ay0A2zAmhEwkF90A5zAzwA2yA02AzmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlyBmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5zAwwAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zAzwA2zAx5A1mAjpFk9BxzA4yA20A20A5zAz5AmzEp6Fl9BzwAy4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFzmAhwFj9B05AzzAw2AzxA51AmhEwkF90A5zAzwA2zAx5A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlzBmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5zAw5ATkzFARksFAQtjF1D35uA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de//
Frame F616
|
13 KB
5 KB
|
58ms
58ms
|
Script
text/javascript |
23.60.16.116
AKAMAI-AS
|
|
|
GET
H2
|
200
|
impr
Show response
gaa.adscale.de/
Frame 4F2C
|
488 B
724 B
|
183ms
182ms
|
Script
text/javascript |
18.185.214.82
AMAZON-02
|
|
|
GET
H2
|
200
|
impr
Show response
gaa.adscale.de/
Frame BDAB
|
488 B
724 B
|
154ms
154ms
|
Script
text/javascript |
18.185.214.82
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 77A0
|
48 B
603 B
|
2467ms
250ms
|
XHR
text/xml |
62.168.44.125
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=d9915971-6900-4502-9602-3f2f1a3d6d98&bust=3abd1354a4&ref=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.125
Prague, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- host-125.billboard.cz
- Software
-
nginx/1.16.1 /
- Resource Hash
- c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 77A0
|
43 B
307 B
|
64ms
38ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/le.php?zoneid=5051&bannerid=23395&eventId=21&plr=3&cb=0.48221665147256476&loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2Fhttps%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dur=0
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.pcgameshardware.de/4fbafaa03aabbe29e1e32787678f2aa09df3cd2d/
Frame FABB
|
120 B
693 B
|
7367ms
44ms
|
XHR
application/json |
144.76.12.56
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.pcgameshardware.de/4fbafaa03aabbe29e1e32787678f2aa09df3cd2d/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.12.56
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.56.12.76.144.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 843170e06a22bc019928db6559cffe4b5820dc57c43ef9b9e1458fa754dbbc8b
|
GET
H2
|
200
|
userconnect
Show response
ih.adscale.de/
Frame F616
|
23 B
117 B
|
22ms
22ms
|
Script
application/javascript |
18.185.150.7
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
81ms
80ms
|
Script
text/javascript |
23.37.53.21
AKAMAI-AS
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n31=1&n121=2&n116=0&n104=0&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n13=1&n125=0&n8=4&n137=0&n101=0&n108=0&n54=0&n110=1&n87=1&n149=0&n76=1&n66=0&n139=0&n160=0&n28=1&n107=0&n21=1&n117=4&n86=0&n147=4&n64=0&n36=1&n119=5&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=1&n12=3&n141=0&n157=1&n26=1&n99=1&n128=1&n73=1&n118=3&n85=0&n9=3&n23=1&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=1&n16=1&n79=0&n93=4&n90=0&n55=1&n142=0&n7=2&n103=1&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=3&n3=1&n82=1&n33=1&n59=1&n84=1&n5=3&n48=1&n109=1&n122=2&n32=1&n67=1&n115=1&n89=2&n123=1&n17=1&n78=1&n41=1&n81=1&n88=0&n39=1&n156=0&n148=0&n133=1
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
23.37.53.21
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a23-37-53-21.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- 0f10363f958690706082b7ab77d381af142c1ce290cf3a896960ff86487bc6c6
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de//
Frame BDAB
|
13 KB
5 KB
|
58ms
57ms
|
Script
text/javascript |
23.60.16.116
AKAMAI-AS
|
|
|
GET
H2
|
200
|
show_ads.js
Show response
pagead2.googlesyndication.com/pagead/
Frame 2D0A
|
80 KB
29 KB
|
20ms
19ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=406234227e2a1d846150e4fae9b08605&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D406234227e2a1d846150e4fae9b08605%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=406234227e2a1d846150e4fae9b08605&userId=adscale-user:200cff74ec9843a392936e21733824be
|
44 B
574 B
|
85ms
34ms
|
Image
image/gif |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
bounce
ib.adnxs.com/
Redirect Chain
-
https://tracking.m6r.eu/sync/appnexusRedirect
-
https://ib.adnxs.com/setuid?entity=197&code=406234227e2a1d846150e4fae9b08605
-
https://ib.adnxs.com/bounce?%2Fsetuid%3Fentity%3D197%26code%3D406234227e2a1d846150e4fae9b08605
|
43 B
1 KB
|
18ms
18ms
|
Image
image/gif |
185.33.223.80
ASN-APPNEX
|
|
|
GET
H/1.1
|
200
OK
|
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=QGI0In4qHYRhUOT66bCGBQ
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=QGI0In4qHYRhUOT66bCGBQ&google_tc=
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
569 B
|
41ms
40ms
|
Image
image/gif |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H/1.1
|
204
No Content
|
m
ad.yieldlab.net/
Redirect Chain
-
https://tracking.m6r.eu/sync/yieldlabRedirect
-
https://ad.yieldlab.net/m?dt_id=36356&ext_id=406234227e2a1d846150e4fae9b08605
|
0
360 B
|
80ms
80ms
|
Image
text/plain |
23.61.243.29
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de//
Frame 4F2C
|
13 KB
5 KB
|
62ms
62ms
|
Script
text/javascript |
23.60.16.116
AKAMAI-AS
|
|
|
GET
H2
|
200
|
show_ads.js
Show response
pagead2.googlesyndication.com/pagead/
Frame CE67
|
80 KB
29 KB
|
21ms
21ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
Frame 2D0A
|
109 B
171 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:81e::2002
GOOGLE
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.pcgameshardware.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
Frame 2D0A
|
109 B
171 B
|
16ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81e::2002
GOOGLE
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.pcgameshardware.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/
Frame 2D0A
|
222 KB
83 KB
|
31ms
31ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7a94735f3a0e915a85bd8e216702c3146e1ffd2f6395276c8e5baee1249baaf1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20200305/r20190131/
Frame BC96
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:818::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20200305/r20190131/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
Frame CE67
|
109 B
171 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:81e::2002
GOOGLE
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.pcgameshardware.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
Frame CE67
|
109 B
171 B
|
19ms
18ms
|
Script
application/javascript |
2a00:1450:4001:81e::2002
GOOGLE
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.pcgameshardware.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/
Frame CE67
|
222 KB
83 KB
|
31ms
31ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7a94735f3a0e915a85bd8e216702c3146e1ffd2f6395276c8e5baee1249baaf1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 05E3
|
0
0
|
232ms
232ms
|
Document
text/html |
2a00:1450:4001:818::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-8813347375005258&output=html&h=250&slotname=5657321521&adk=1821734436&adf=3530038685&w=300&guci=1.2.0.0.2.2.0.0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1584389319510&bpp=16&bdt=31&fdt=56&idt=56&shv=r20200305&cbv=r20190131&ptt=5&saldr=sa&correlator=4330314914533&frm=23&ife=4&pv=2&ga_vid=344564226.1584389320&ga_sid=1584389320&ga_hid=1115592230&ga_fc=0&iag=15&icsg=170&nhd=2&dssz=5&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=848&ady=2940&biw=1585&bih=1200&isw=0&ish=0&ifk=3724966447&scr_x=0&scr_y=0&eid=44713363&oid=3&pvsid=3935956550367115&rx=0&eae=2&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C0%2C0&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=1044&bc=31&ifi=1&uci=1.etqwj5vphiit&btvi=1&fsb=1&dtd=70
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 2D0A
|
73 KB
27 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2733fb957d8514f74ed5c70171329edfb5243b062b668ffef13d52dbc68e45de
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 8F25
|
0
0
|
200ms
200ms
|
Document
text/html |
2a00:1450:4001:818::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-8813347375005258&output=html&h=250&slotname=5657321521&adk=1821734436&adf=3530038684&w=300&guci=1.2.0.0.2.2.0.0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1584389319538&bpp=7&bdt=31&fdt=86&idt=86&shv=r20200305&cbv=r20190131&ptt=5&saldr=sa&correlator=4330314914533&frm=23&ife=4&pv=1&ga_vid=2006618431.1584389320&ga_sid=1584389320&ga_hid=595966684&ga_fc=0&iag=15&icsg=170&nhd=2&dssz=5&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&isw=0&ish=0&ifk=3724966447&scr_x=0&scr_y=0&oid=3&pvsid=2077835812915466&rx=0&eae=2&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C0%2C0&vis=1&rsz=%7C%7CEr%7C&abl=CS&pfx=0&fu=1044&bc=31&ifi=1&uci=1.b6yteppaamj7&fsb=1&dtd=89
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
Frame CE67
|
73 KB
27 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2733fb957d8514f74ed5c70171329edfb5243b062b668ffef13d52dbc68e45de
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
44ms
43ms
|
Image
image/gif |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 7764
|
0
0
|
80ms
24ms
|
Document
text/html |
151.101.13.108
FASTLY
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.108
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
showad.js
ads.pubmatic.com/AdServer/js/
Frame 42E5
|
0
0
|
74ms
33ms
|
Document
text/html |
92.122.252.114
AKAMAI-AS
|
|
|
GET
H2
|
200
|
index.html
cdn.districtm.io/ids/
Frame 24B8
|
0
0
|
162ms
119ms
|
Document
text/html |
104.16.68.69
CLOUDFLARENET
|
|
General
- Full URL
- https://cdn.districtm.io/ids/index.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.68.69
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame E4C9
|
0
0
|
98ms
43ms
|
Document
text/html |
151.101.13.108
FASTLY
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.108
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
showad.js
ads.pubmatic.com/AdServer/js/
Frame 9C2B
|
0
0
|
92ms
24ms
|
Document
text/html |
92.122.252.114
AKAMAI-AS
|
|
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame 938F
Redirect Chain
-
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
-
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
|
0
0
|
36ms
36ms
|
Document
text/html |
34.95.120.147
GOOGLE
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.179.0 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 659B
|
0
0
|
92ms
24ms
|
Document
text/html |
151.101.13.108
FASTLY
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.108
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
usync.html
eus.rubiconproject.com/
Frame DCA3
|
0
0
|
322ms
25ms
|
Document
text/html |
23.37.55.184
AKAMAI-AS
|
|
|
GET
H2
|
200
|
4933062463
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
22ms
22ms
|
XHR
application/json |
18.194.21.214
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
27ms
27ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/hQk4OJOBALlnFHUkzFCCPIAAAAAAAABI3AAPAAAFAAI3ATjHWAPAAAQNA8tABjHWAZAAAOA55A55A85B55A58E55A55AEAz1Ay4ArjHWAPbDAQNA8tAHjHWAPAAAsEA6DAMjHWAPBAAAAAAAAIPhsASksFmGjAAAAAAAAAAAAEAAAI3AAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHAzwAy4Ey1AwBEMAxzA4yA20A20A5zAz5AGAkpFylFj0FAAAAIAy4AxyA11Az1AKA05AzzAw2AzxA51AKAylFj0FhuFnsFlzBKA05AzzAw2AzxA51AKA05AzzAw2AzxA51AIBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlzBdQNA8tAuEA6DAFAAAjHWAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFgfQCTA
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
4933063195
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
23ms
23ms
|
XHR
application/json |
18.194.21.214
AMAZON-02
|
|
|
GET
H2
|
200
|
tag
Show response
a.teads.tv/page/95637/
Frame 77A0
|
746 B
795 B
|
110ms
56ms
|
Script
application/javascript |
23.210.248.12
AKAMAI-AS
|
|
|
GET
H2
|
200
|
teads-format.min.js
Show response
a.teads.tv/media/format/v3/
|
675 KB
185 KB
|
30ms
29ms
|
Script
text/javascript |
23.210.248.12
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
p2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
-
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
|
43 B
309 B
|
23ms
23ms
|
Image
image/gif |
23.11.238.95
AKAMAI-AS
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=16311930&cs_ucfr=1
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.11.238.95
, United States,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a23-11-238-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
143 B
|
163ms
99ms
|
Image
image/gif |
72.247.225.182
AKAMAI-AS
|
|
General
- Full URL
- https://t.teads.tv/track?action=placementCall&ts=1584389322056&pageId=95637&pid=103521&env=js-web&pfid=[pfid]&f=1&vid=[viewerId]&auctid=97cffea0-a55d-4598-8b73-42a5ab943c97&fv=278-for-3823&referer=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
72.247.225.182
, United States,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a72-247-225-182.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
143 B
|
165ms
102ms
|
Image
image/gif |
72.247.225.182
AKAMAI-AS
|
|
General
- Full URL
- https://t.teads.tv/track?action=slotAvailable&ts=1584389322057&pageId=95637&pid=103521&env=js-web&pfid=[pfid]&f=1&slot=native&vid=[viewerId]&auctid=97cffea0-a55d-4598-8b73-42a5ab943c97&fv=278-for-3823&referer=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
72.247.225.182
, United States,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a72-247-225-182.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/95637/
|
168 B
430 B
|
105ms
103ms
|
XHR
application/json |
23.210.248.12
AKAMAI-AS
|
|
General
- Full URL
- https://a.teads.tv/page/95637/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&page=%7B%22id%22%3A95637%2C%22placements%22%3A%5B%7B%22id%22%3A103521%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A610%2C%22height%22%3A343%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&auctid=97cffea0-a55d-4598-8b73-42a5ab943c97&userId=3c5eae62-4f38-422e-90bc-3004526caf03&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=332
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
23.210.248.12
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a23-210-248-12.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- ab932140887619c7a62746e754bdf982840ed9adfcf54e72ef5f91224894071f
|
GET
H2
|
200
|
iframe
sync.teads.tv/
Frame 9508
|
0
0
|
109ms
61ms
|
Document
text/html |
95.100.64.146
AKAMAI-AS
|
|
General
- Full URL
- https://sync.teads.tv/iframe?pid=103521&userId=3c5eae62-4f38-422e-90bc-3004526caf03&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1584389322185
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
95.100.64.146
, Ascension Island,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a95-100-64-146.deploy.static.akamaitechnologies.com
- Software
-
akka-http/10.1.5 /
- Resource Hash
|
GET
H2
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=1796390970&t=event&_s=2&dl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-K...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=854485460&_gid=1542115608.1584389316&gjid=1164420051&_v=j81&z=568947992
|
35 B
102 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:400c:c0c::9d
GOOGLE
|
|
General
- Full URL
- https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=854485460&_gid=1542115608.1584389316&gjid=1164420051&_v=j81&z=568947992
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:400c:c0c::9d
Brussels, Belgium,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
142ms
48ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43099:time[url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,type_article:shortread,article_layout:default,site_skin:desktop,device:desktop,custom_page_type:Article%20page,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&1584389325608
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Finland,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame 2D0A
|
7 KB
5 KB
|
17ms
17ms
|
XHR
application/json |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20200305&st=env
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- c678042969d9f9d2bcbe0632519ccb358d097471ee3f9c85f142b8d6b685a2ae
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame 2D0A
|
14 KB
5 KB
|
40ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81c::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/
Frame 5EA5
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81c::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame CE67
|
7 KB
5 KB
|
17ms
17ms
|
XHR
application/json |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20200305&st=env
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 69867d996e05e1aa4c941e9ffa394ac9ccc7faf50c92761942ed4f9b7bd9dab1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame CE67
|
14 KB
5 KB
|
41ms
40ms
|
Script
text/javascript |
2a00:1450:4001:81c::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame 2D0A
|
0
49 B
|
20ms
20ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gda_r20200305&jk=3935956550367115&bg=!cnGlcWlYS-EcU9Qgm1wCAAAAaFIAAAAPmQGIlBhOZstZRK1PZFOTmZWn8POnxxtl1edypGKXgorQo4EgDj7SZxjWC5jOWnjLhm8LyX4rT6FYNOV3kdHAMmAmjI2jkcnD3og6ATdlNzZ9oj9iyBXKjUxJpQYBZeMfhJG8d23zXDO3KwWkwOUwuVyAUKNcqHRwvCSr3Kl1n-eVOyEllSh5tbCTSnzq3YvwcijIK-tJV6a2-osDtB3yfwEYVBIKrPo-scP9v5CqCrfwIADggVsvidvzDQRDq4S3i7X7ktPYLHN0ywqC1mQKCTVOgYevidBff6bjigm57ThnXyHS_s01i_9X0ja508lWZasyi_WADw1OIBoLT-f72ljZC_Qnh0w6rYfsw3ICCcsIcpqrYmhjXvLx6JhuPhtYHSYTZpuWjOJOponOMWQyUrAnkfh6wIBl-MlFTq8UOMmnT1wYc6hmMrjoCDJgcYsYAgPQ2rlQ2TmK0RBTYjhaoXfHOLtp-HpguLhgoZzP6h_bztgF9w_rRvAJAdc34OI9S5q7XwAZsbf195Q
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/
Frame 399D
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81c::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame CE67
|
0
58 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gda_r20200305&jk=2077835812915466&bg=!6eql6vJYThZaUnT6vjoCAAAAgVIAAAAPmQGIbuirb4IzmPw8oRPdC2sPucYM4mf_DqZUR0OmXGb5vA7SkafNxU8Kw_bhtnosbyMYHkiwPW_A0nqqvQbJqL8BxT1RxboGugVcASDPn63Mdj_Jq1vCDcaR9SxmMB4uqtTNhi7J55Dl7AaALBzT2nVsALBWHHTxjvnmvI0kuJyKWuwYR5GoIcels7_LdIExHTDR62ZRelHtdSSY0hKIj0-thKp5FRLgb2_C4Jc3kuuZdtsADHLpqDNWlosXsoyneMG_6UGDlk65OxRrTVZp98uQMrupiFP7seatAn7FG_3o7KQG-p-ZwyKRPVXeVFiFCpF9pQBwzsJndmApTTCwUaKv2rPdaIDdZ7yyv2i7YO9XWfp8Uw1kGVbwcu6preWRjkSWPZJqYZc3C6QkyJ4tEf5nJPSxCxDj8yCIVguxy9veTdfLsuxV63FtE8ZGBKddw1nGfOLUiqClVsRlyzFAarIVLIjKzBwcf25wprLJ6s3QutktoOEVzAeh87EkqLdKOnqt_ruInoS9i34
- Requested by
- Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
style.min.css
www.pcgameshardware.de/common/disclaimer/
|
3 KB
941 B
|
30ms
30ms
|
Stylesheet
text/css |
2606:4700:10::6814:d2f
CLOUDFLARENET
|
|
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
73 B
494 B
|
32ms
32ms
|
Script
text/javascript |
37.157.6.246
ADFORM
|
|
General
- Full URL
- https://track.adform.net/Serving/Cookie/?adfaction=getjs;adfcookname=uid
- Requested by
- Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.6.246
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
|
7 KB
5 KB
|
18ms
17ms
|
XHR
application/json |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020030501&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 448d79555f251e9bb3bcee9b24e9aa35e5f690832cebd97447fc9044e66d667b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
|
14 KB
5 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:81c::2001
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
8 KB
3 KB
|
138ms
45ms
|
Script
text/javascript |
23.60.16.116
AKAMAI-AS
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
1102ms
23ms
|
Script
application/javascript |
89.163.159.108
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
0
316 B
|
269ms
64ms
|
Script
application/javascript |
194.213.222.30
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
1133ms
38ms
|
Script
text/javascript |
54.171.36.151
AMAZON-02
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
24ms
7ms
|
Script
application/javascript |
2600:9000:214f:c200:15:efbc:e300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
582 B
|
1086ms
25ms
|
Image
image/gif |
35.186.238.175
GOOGLE
|
|
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/
Frame EA14
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81c::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
58 B
|
16ms
15ms
|
Image
image/gif |
2a00:1450:4001:814::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020030501&jk=251194220074141&bg=!AgGlARlYbW2_AeM1IB4CAAAATlIAAAAOmQFidZxkY0eGIytadA1oJeEU0DHUyfunJrTKYlbbKl2yyxfeByHFppXt6h5RPXpgo1TLyVZ4-3dRsyWo6wayZIfbucmGFrr7tUS7-ypdTotlh-2T-Qp3iMVyFApsGA5WdSRckVIP72_LkeuuKoWq8RgYjHUYL2Pv9HNvtHSw7L5w2qcO3fVpjFd-OURYD2l_iDtPenkgUqOjAKNsttogIPd4h8NmJBqQDO4Mw-nb2Kev01N9evkzdqdNNI0uRFjQYHCWWya9huH-vP0hintt3tvJFLsz1DsOt4OvYr6XwFZQnzqOL_QgPzh9FNCrOoMQj96ED3cw4aN-xEYngm3TMU_bQbZw4epzSKKJr0YL2ewLJcM8Xrursm6AOLD2KJYI5oDthSdO_UDctJQwVdrh9oG87GBZmIdQqP5-VcanXanRNsVHMs_wdNxh1Tn2mOicoxaO27JmHu_eW3e5aX7cyXZ8Ljpd
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
launcher.js
Show response
sak.userreport.com/sdm/
|
64 KB
20 KB
|
1099ms
34ms
|
Script
application/javascript |
13.224.194.82
AMAZON-02
|
|
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.25/
|
5 KB
2 KB
|
45ms
14ms
|
Script
application/javascript |
2600:9000:2204:d200:1c:8c89:a300:93a1
AMAZON-02
|
|
|
GET
H2
|
200
|
/
d.agkn.com/iframe/8613/
Frame 2B96
|
0
0
|
22ms
9ms
|
Document
text/html |
2600:9000:21f3:7c00:19:fc2c:a140:93a1
AMAZON-02
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=573868803&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F%22%2C%22gdpr%22%3A%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:21f3:7c00:19:fc2c:a140:93a1
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
3 KB
2 KB
|
41ms
40ms
|
Script
text/javascript |
54.171.36.151
AMAZON-02
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&hostSiteUrl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=406234227e2a1d846150e4fae9b08605&event_id=page_view&_sid=69511&_ver=0.2.25&_seg=jsonp&_=452904394588
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.25/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.171.36.151
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- ec2-54-171-36-151.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 00e55928cc2411c7cd9b0bf3995a8d03c14b72d554e2243ea9cd2a2123c03fb4
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
849 B
|
1168ms
41ms
|
Script
application/javascript |
34.253.51.81
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame EF8D
|
0
0
|
154ms
40ms
|
Document
text/html |
34.252.24.237
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
134ms
44ms
|
XHR
text/javascript |
95.216.24.148
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43099:time[url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,type_article:shortread,article_layout:default,site_skin:desktop,device:desktop,custom_page_type:Article%20page,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&1584389335609
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
95.216.24.148
, Finland,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.148.24.216.95.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|