galaxy-commits
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
April 2014
- 1 participants
- 261 discussions
commit/galaxy-central: carlfeberhard: UI: add GalaxyApp to base_panels.mako; add requirejs i18n plugin and nls/zh, nls/ja locale files, wire into _l client localizer, remove previous localization cruft; remove reliance on history_panel.mako
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
MSBuZXcgY29tbWl0IGluIGdhbGF4eS1jZW50cmFsOgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dh
bGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzL2RjYzBjMTkxNDdlYS8KQ2hhbmdlc2V0OiAgIGRj
YzBjMTkxNDdlYQpVc2VyOiAgICAgICAgY2FybGZlYmVyaGFyZApEYXRlOiAgICAgICAgMjAxNC0w
NC0xNSAxODozMTozMwpTdW1tYXJ5OiAgICAgVUk6IGFkZCBHYWxheHlBcHAgdG8gYmFzZV9wYW5l
bHMubWFrbzsgYWRkIHJlcXVpcmVqcyBpMThuIHBsdWc9CmluIGFuZCBubHMvemgsIG5scy9qYSBs
b2NhbGUgZmlsZXMsIHdpcmUgaW50byBfbCBjbGllbnQgbG9jYWxpemVyLCByZW1vdmUgcD0KcmV2
aW91cyBsb2NhbGl6YXRpb24gY3J1ZnQ7IHJlbW92ZSByZWxpYW5jZSBvbiBoaXN0b3J5X3BhbmVs
Lm1ha28KQWZmZWN0ZWQgIzogIDQxIGZpbGVzCgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAx
NjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNh
ZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL2dhbGF4eS1hcHAtYmFzZS5qcwotLS0gYS9zdGF0aWMv
c2NyaXB0cy9nYWxheHktYXBwLWJhc2UuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvZ2FsYXh5LWFw
cC1iYXNlLmpzCkBAIC0xLDMzICsxLDQ0IEBACiBkZWZpbmUoWwogICAgICdtdmMvdXNlci91c2Vy
LW1vZGVsJywKICAgICAndXRpbHMvbWV0cmljcy1sb2dnZXInLAotICAgICd1dGlscy9hZGQtbG9n
Z2luZycKLV0sIGZ1bmN0aW9uKCB1c2VyTW9kZWwsIG1ldHJpY3NMb2dnZXIsIGFkZExvZ2dpbmcg
KXsKKyAgICAndXRpbHMvYWRkLWxvZ2dpbmcnLAorICAgICd1dGlscy9sb2NhbGl6YXRpb24nCitd
LCBmdW5jdGlvbiggdXNlck1vZGVsLCBtZXRyaWNzTG9nZ2VyLCBhZGRMb2dnaW5nLCBsb2NhbGl6
ZSApewogLy8gPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0KPTNEPTNEPTNECi0vKioKLSAqCisvKiogQmFzZSBnYWxheHkgY2xpZW50LXNpZGUgYXBw
bGljYXRpb24uCisgKiAgICAgIEluaWl0aWFsaXplczoKKyAqICAgICAgICAgIGxvZ2dlciAgICAg
IDogdGhlIGxvZ2dlci9tZXRyaWNzLWxvZ2dlcgorICogICAgICAgICAgbG9jYWxpemUgICAgOiB0
aGUgc3RyaW5nIGxvY2FsaXplcgorICogICAgICAgICAgY29uZmlnICAgICAgOiB0aGUgY3VycmVu
dCBjb25maWd1cmF0aW9uIChhbnkgay92IGluCisgKiAgICAgICAgICAgICAgdW5pdmVyc2Vfd3Nn
aS5pbmkgYXZhaWxhYmxlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gQVBJKQorICogICAgICAgICAg
dXNlciAgICAgICAgOiB0aGUgY3VycmVudCB1c2VyIChhcyBhIG12Yy91c2VyL3VzZXItbW9kZWwp
CiAgKi8KIGZ1bmN0aW9uIEdhbGF4eUFwcCggb3B0aW9ucyApewogICAgIHZhciBzZWxmID0zRCB0
aGlzOwogICAgIHJldHVybiBzZWxmLl9pbml0KCBvcHRpb25zIHx8IHt9ICk7CiB9CisvLyBhZGQg
bG9nZ2luZyBzaG9ydGN1dHMgZm9yIHRoaXMgb2JqZWN0CiBhZGRMb2dnaW5nKCBHYWxheHlBcHAs
ICdHYWxheHlBcHAnICk7Cj0yMAotLyoqICAqLworLyoqIGRlZmF1bHQgb3B0aW9ucyAqLwogR2Fs
YXh5QXBwLmRlZmF1bHRPcHRpb25zID0zRCB7CisgICAgLyoqIHJvb3QgdXJsIG9mIHRoaXMgYXBw
ICovCiAgICAgLy8gbW92ZSB0byBzZWxmLnJvb3Q/CiAgICAgcm9vdCAgICAgICAgOiAnLycKIH07
Cj0yMAotLyoqICAqLworLyoqIGluaXRhbGl6ZSBvcHRpb25zIGFuZCBzdWItY29tcG9uZW50cyAq
LwogR2FsYXh5QXBwLnByb3RvdHlwZS5faW5pdCA9M0QgZnVuY3Rpb24gaW5pdCggb3B0aW9ucyAp
ewogICAgIHZhciBzZWxmID0zRCB0aGlzOwo9MjAKKyAgICBzZWxmLl9wcm9jZXNzT3B0aW9ucygg
b3B0aW9ucyApOworICAgIHNlbGYuZGVidWcoICdHYWxheHlBcHAub3B0aW9uczogJywgc2VsZi5v
cHRpb25zICk7CisKICAgICBzZWxmLl9pbml0TG9nZ2VyKCBvcHRpb25zLmxvZ2dlck9wdGlvbnMg
fHwge30gKTsKICAgICBzZWxmLmRlYnVnKCAnR2FsYXh5QXBwLmxvZ2dlcjogJywgc2VsZi5sb2dn
ZXIgKTsKPTIwCi0gICAgc2VsZi5fcHJvY2Vzc09wdGlvbnMoIG9wdGlvbnMgKTsKLSAgICBzZWxm
LmRlYnVnKCAnR2FsYXh5QXBwLm9wdGlvbnM6ICcsIHNlbGYub3B0aW9ucyApOworICAgIHNlbGYu
X2luaXRMb2NhbGUoKTsKKyAgICBzZWxmLmRlYnVnKCAnR2FsYXh5QXBwLmxvY2FsaXplOiAnLCBz
ZWxmLmxvY2FsaXplICk7Cj0yMAogICAgIHNlbGYuY29uZmlnID0zRCBvcHRpb25zLmNvbmZpZyB8
fCB7fTsKICAgICBzZWxmLmRlYnVnKCAnR2FsYXh5QXBwLmNvbmZpZzogJywgc2VsZi5jb25maWcg
KTsKQEAgLTM4LDcgKzQ5LDcgQEAKICAgICByZXR1cm4gc2VsZjsKIH07Cj0yMAotLyoqICAqLwor
LyoqIGFkZCBhbiBvcHRpb24gZnJvbSBvcHRpb25zIGlmIHRoZSBrZXkgbWF0Y2hlcyBhbiBvcHRp
b24gaW4gZGVmYXVsdE9wdGk9Cm9ucyAqLwogR2FsYXh5QXBwLnByb3RvdHlwZS5fcHJvY2Vzc09w
dGlvbnMgPTNEIGZ1bmN0aW9uIF9wcm9jZXNzT3B0aW9ucyggb3B0aW9ucyA9Cil7CiAgICAgdmFy
IHNlbGYgPTNEIHRoaXMsCiAgICAgICAgIGRlZmF1bHRzID0zRCBHYWxheHlBcHAuZGVmYXVsdE9w
dGlvbnM7CkBAIC01Myw3ICs2NCw3IEBACiAgICAgcmV0dXJuIHNlbGY7CiB9Owo9MjAKLS8qKiAg
Ki8KKy8qKiBzZXQgdXAgdGhlIGN1cnJlbnQgdXNlciBhcyBhIEJhY2tib25lIG1vZGVsIChtdmMv
dXNlci91c2VyLW1vZGVsKSAqLwogR2FsYXh5QXBwLnByb3RvdHlwZS5faW5pdFVzZXIgPTNEIGZ1
bmN0aW9uIF9pbml0VXNlciggdXNlckpTT04gKXsKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKICAg
ICBzZWxmLmRlYnVnKCAnX2luaXRVc2VyOicsIHVzZXJKU09OICk7CkBAIC02MSw3ICs3Miw3IEBA
CiAgICAgcmV0dXJuIHNlbGY7CiB9Owo9MjAKLS8qKiAgKi8KKy8qKiBzZXQgdXAgdGhlIG1ldHJp
Y3MgbG9nZ2VyICh1dGlscy9tZXRyaWNzLWxvZ2dlcikgYW5kIHBhc3MgbG9nZ2VyT3B0aW9uPQpz
ICovCiBHYWxheHlBcHAucHJvdG90eXBlLl9pbml0TG9nZ2VyID0zRCBmdW5jdGlvbiBfaW5pdExv
Z2dlciggbG9nZ2VyT3B0aW9ucyApewogICAgIHZhciBzZWxmID0zRCB0aGlzOwogICAgIHNlbGYu
ZGVidWcoICdfaW5pdExvZ2dlcjonLCBsb2dnZXJPcHRpb25zICk7CkBAIC02OSw3ICs4MCwxNyBA
QAogICAgIHJldHVybiBzZWxmOwogfTsKPTIwCi0vKiogICovCisvKiogYWRkIHRoZSBsb2NhbGl6
ZSBmbiB0byB0aGlzIG9iamVjdCBhbmQgdGhlIHdpbmRvdyBuYW1lc3BhY2UgKGFzICdfbCcpID0K
Ki8KK0dhbGF4eUFwcC5wcm90b3R5cGUuX2luaXRMb2NhbGUgPTNEIGZ1bmN0aW9uIF9pbml0TG9j
YWxlKCBvcHRpb25zICl7CisgICAgdmFyIHNlbGYgPTNEIHRoaXM7CisgICAgc2VsZi5kZWJ1Zygg
J19pbml0TG9jYWxlOicsIG9wdGlvbnMgKTsKKyAgICBzZWxmLmxvY2FsaXplID0zRCBsb2NhbGl6
ZTsKKyAgICAvLyBhZGQgdG8gd2luZG93IGFzIGdsb2JhbCBzaG9ydGVuZWQgYWxpYXMKKyAgICB3
aW5kb3cuX2wgPTNEIHNlbGYubG9jYWxpemU7CisgICAgcmV0dXJuIHNlbGY7Cit9OworCisvKiog
c3RyaW5nIHJlcCAqLwogR2FsYXh5QXBwLnByb3RvdHlwZS50b1N0cmluZyA9M0QgZnVuY3Rpb24g
dG9TdHJpbmcoKXsKICAgICB2YXIgdXNlckVtYWlsID0zRCB0aGlzLnVzZXIuZ2V0KCAnZW1haWwn
ICkgfHwgJyhhbm9ueW1vdXMpJzsKICAgICByZXR1cm4gJ0dhbGF4eUFwcCgnICsgdXNlckVtYWls
ICsgJyknOwoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYz
IC1yIGRjYzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2Ny
aXB0cy9pMThuLmpzCi0tLSAvZGV2L251bGwKKysrIGIvc3RhdGljL3NjcmlwdHMvaTE4bi5qcwpA
QCAtMCwwICsxLDE4MyBAQAorLyoqCisgKiBAbGljZW5zZSBSZXF1aXJlSlMgaTE4biAyLjAuNCBD
b3B5cmlnaHQgKGMpIDIwMTAtMjAxMiwgVGhlIERvam8gRm91bmRhdD0KaW9uIEFsbCBSaWdodHMg
UmVzZXJ2ZWQuCisgKiBBdmFpbGFibGUgdmlhIHRoZSBNSVQgb3IgbmV3IEJTRCBsaWNlbnNlLgor
ICogc2VlOiBodHRwOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvaTE4biBmb3IgZGV0YWlscworICov
CisvKmpzbGludCByZWdleHA6IHRydWUgKi8KKy8qZ2xvYmFsIHJlcXVpcmU6IGZhbHNlLCBuYXZp
Z2F0b3I6IGZhbHNlLCBkZWZpbmU6IGZhbHNlICovCisKKy8qKgorICogVGhpcyBwbHVnaW4gaGFu
ZGxlcyBpMThuISBwcmVmaXhlZCBtb2R1bGVzLiBJdCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgKgor
ICogMSkgQSByZWd1bGFyIG1vZHVsZSBjYW4gaGF2ZSBhIGRlcGVuZGVuY3kgb24gYW4gaTE4biBi
dW5kbGUsIGJ1dCB0aGUgcmU9Cmd1bGFyCisgKiBtb2R1bGUgZG9lcyBub3Qgd2FudCB0byBzcGVj
aWZ5IHdoYXQgbG9jYWxlIHRvIGxvYWQuIFNvIGl0IGp1c3Qgc3BlY2lmaT0KZXMKKyAqIHRoZSB0
b3AtbGV2ZWwgYnVuZGxlLCBsaWtlICJpMThuIW5scy9jb2xvcnMiLgorICoKKyAqIFRoaXMgcGx1
Z2luIHdpbGwgbG9hZCB0aGUgaTE4biBidW5kbGUgYXQgbmxzL2NvbG9ycywgc2VlIHRoYXQgaXQg
aXMgYSByPQpvb3QvbWFzdGVyCisgKiBidW5kbGUgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBhIGxv
Y2FsZSBpbiBpdHMgbmFtZS4gSXQgd2lsbCB0aGVuIHRyeSB0bz0KIGZpbmQKKyAqIHRoZSBiZXN0
IG1hdGNoIGxvY2FsZSBhdmFpbGFibGUgaW4gdGhhdCBtYXN0ZXIgYnVuZGxlLCB0aGVuIHJlcXVl
c3QgYWxsPQogdGhlCisgKiBsb2NhbGUgcGllY2VzIGZvciB0aGF0IGJlc3QgbWF0Y2ggbG9jYWxl
LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBsb2NhbGUgaT0KcyAiZW4tdXMiLAorICogdGhlbiB0aGUg
cGx1Z2luIHdpbGwgYXNrIGZvciB0aGUgImVuLXVzIiwgImVuIiBhbmQgInJvb3QiIGJ1bmRsZXMg
dG8gYmU9CiBsb2FkZWQKKyAqIChidXQgb25seSBpZiB0aGV5IGFyZSBzcGVjaWZpZWQgb24gdGhl
IG1hc3RlciBidW5kbGUpLgorICoKKyAqIE9uY2UgYWxsIHRoZSBidW5kbGVzIGZvciB0aGUgbG9j
YWxlIHBpZWNlcyBsb2FkLCB0aGVuIGl0IG1peGVzIGluIGFsbCB0PQpob3NlCisgKiBsb2NhbGUg
cGllY2VzIGludG8gZWFjaCBvdGhlciwgdGhlbiBmaW5hbGx5IHNldHMgdGhlIGNvbnRleHQuZGVm
aW5lZCB2YT0KbHVlCisgKiBmb3IgdGhlIG5scy9jb2xvcnMgYnVuZGxlIHRvIGJlIHRoYXQgbWl4
ZWQgaW4gbG9jYWxlLgorICoKKyAqIDIpIEEgcmVndWxhciBtb2R1bGUgc3BlY2lmaWVzIGEgc3Bl
Y2lmaWMgbG9jYWxlIHRvIGxvYWQuIEZvciBpbnN0YW5jZSwKKyAqIGkxOG4hbmxzL2ZyLWZyL2Nv
bG9ycy4gSW4gdGhpcyBjYXNlLCB0aGUgcGx1Z2luIG5lZWRzIHRvIGxvYWQgdGhlIG1hc3RlPQpy
IGJ1bmRsZQorICogZmlyc3QsIGF0IG5scy9jb2xvcnMsIHRoZW4gZmlndXJlIG91dCB3aGF0IHRo
ZSBiZXN0IG1hdGNoIGxvY2FsZSBpcyBmb3I9CiBmci1mciwKKyAqIHNpbmNlIG1heWJlIG9ubHkg
ZnIgb3IganVzdCByb290IGlzIGRlZmluZWQgZm9yIHRoYXQgbG9jYWxlLiBPbmNlIHRoYXQgPQpi
ZXN0CisgKiBmaXQgaXMgZm91bmQsIGFsbCBvZiBpdHMgbG9jYWxlIHBpZWNlcyBuZWVkIHRvIGhh
dmUgdGhlaXIgYnVuZGxlcyBsb2FkZT0KZC4KKyAqCisgKiBPbmNlIGFsbCB0aGUgYnVuZGxlcyBm
b3IgdGhlIGxvY2FsZSBwaWVjZXMgbG9hZCwgdGhlbiBpdCBtaXhlcyBpbiBhbGwgdD0KaG9zZQor
ICogbG9jYWxlIHBpZWNlcyBpbnRvIGVhY2ggb3RoZXIsIHRoZW4gZmluYWxseSBzZXRzIHRoZSBj
b250ZXh0LmRlZmluZWQgdmE9Cmx1ZQorICogZm9yIHRoZSBubHMvZnItZnIvY29sb3JzIGJ1bmRs
ZSB0byBiZSB0aGF0IG1peGVkIGluIGxvY2FsZS4KKyAqLworKGZ1bmN0aW9uICgpIHsKKyAgICAn
dXNlIHN0cmljdCc7CisKKyAgICAvL3JlZ2V4cCBmb3IgcmVjb25zdHJ1Y3RpbmcgdGhlIG1hc3Rl
ciBidW5kbGUgbmFtZSBmcm9tIHBhcnRzIG9mIHRoZSByPQplZ2V4cCBtYXRjaAorICAgIC8vbmxz
UmVnRXhwLmV4ZWMoImZvby9iYXIvYmF6L25scy9lbi1jYS9mb28iKSBnaXZlczoKKyAgICAvL1si
Zm9vL2Jhci9iYXovbmxzL2VuLWNhL2ZvbyIsICJmb28vYmFyL2Jhei9ubHMvIiwgIi8iLCAiLyIs
ICJlbi1jYSIsPQogImZvbyJdCisgICAgLy9ubHNSZWdFeHAuZXhlYygiZm9vL2Jhci9iYXovbmxz
L2ZvbyIpIGdpdmVzOgorICAgIC8vWyJmb28vYmFyL2Jhei9ubHMvZm9vIiwgImZvby9iYXIvYmF6
L25scy8iLCAiLyIsICIvIiwgImZvbyIsICIiXQorICAgIC8vc28sIGlmIG1hdGNoWzVdIGlzIGJs
YW5rLCBpdCBtZWFucyB0aGlzIGlzIHRoZSB0b3AgYnVuZGxlIGRlZmluaXRpb24uCisgICAgdmFy
IG5sc1JlZ0V4cCA9M0QgLyheLiooXnxcLylubHMoXC98JCkpKFteXC9dKilcLz8oW15cL10qKS87
CisKKyAgICAvL0hlbHBlciBmdW5jdGlvbiB0byBhdm9pZCByZXBlYXRpbmcgY29kZS4gTG90cyBv
ZiBhcmd1bWVudHMgaW4gdGhlCisgICAgLy9kZXNpcmUgdG8gc3RheSBmdW5jdGlvbmFsIGFuZCBz
dXBwb3J0IFJlcXVpcmVKUyBjb250ZXh0cyB3aXRob3V0IGhhdj0KaW5nCisgICAgLy90byBrbm93
IGFib3V0IHRoZSBSZXF1aXJlSlMgY29udGV4dHMuCisgICAgZnVuY3Rpb24gYWRkUGFydChsb2Nh
bGUsIG1hc3RlciwgbmVlZGVkLCB0b0xvYWQsIHByZWZpeCwgc3VmZml4KSB7CisgICAgICAgIGlm
IChtYXN0ZXJbbG9jYWxlXSkgeworICAgICAgICAgICAgbmVlZGVkLnB1c2gobG9jYWxlKTsKKyAg
ICAgICAgICAgIGlmIChtYXN0ZXJbbG9jYWxlXSA9M0Q9M0Q9M0QgdHJ1ZSB8fCBtYXN0ZXJbbG9j
YWxlXSA9M0Q9M0Q9M0QgPQoxKSB7CisgICAgICAgICAgICAgICAgdG9Mb2FkLnB1c2gocHJlZml4
ICsgbG9jYWxlICsgJy8nICsgc3VmZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH0KKworICAgIGZ1bmN0aW9uIGFkZElmRXhpc3RzKHJlcSwgbG9jYWxlLCB0b0xvYWQsIHByZWZp
eCwgc3VmZml4KSB7CisgICAgICAgIHZhciBmdWxsTmFtZSA9M0QgcHJlZml4ICsgbG9jYWxlICsg
Jy8nICsgc3VmZml4OworICAgICAgICBpZiAocmVxdWlyZS5fZmlsZUV4aXN0cyhyZXEudG9Vcmwo
ZnVsbE5hbWUgKyAnLmpzJykpKSB7CisgICAgICAgICAgICB0b0xvYWQucHVzaChmdWxsTmFtZSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgZnVuY3Rpb24gdG8g
bWl4IGluIHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgaW50byB0YXJnZXQsCisgICAgICogYnV0IG9u
bHkgaWYgdGFyZ2V0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBzYW1l
IG5hbT0KZS4KKyAgICAgKiBUaGlzIGlzIG5vdCByb2J1c3QgaW4gSUUgZm9yIHRyYW5zZmVycmlu
ZyBtZXRob2RzIHRoYXQgbWF0Y2gKKyAgICAgKiBPYmplY3QucHJvdG90eXBlIG5hbWVzLCBidXQg
dGhlIHVzZXMgb2YgbWl4aW4gaGVyZSBzZWVtIHVubGlrZWx5IHRvCisgICAgICogdHJpZ2dlciBh
IHByb2JsZW0gcmVsYXRlZCB0byB0aGF0LgorICAgICAqLworICAgIGZ1bmN0aW9uIG1peGluKHRh
cmdldCwgc291cmNlLCBmb3JjZSkgeworICAgICAgICB2YXIgcHJvcDsKKyAgICAgICAgZm9yIChw
cm9wIGluIHNvdXJjZSkgeworICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShw
cm9wKSAmJiAoIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm89CnApIHx8IGZvcmNlKSkgeworICAg
ICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9M0Qgc291cmNlW3Byb3BdOworICAgICAgICAgICAg
fSBlbHNlIGlmICh0eXBlb2Ygc291cmNlW3Byb3BdID0zRD0zRD0zRCAnb2JqZWN0JykgeworICAg
ICAgICAgICAgICAgIGlmICghdGFyZ2V0W3Byb3BdICYmIHNvdXJjZVtwcm9wXSkgeworICAgICAg
ICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPTNEIHt9OworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBtaXhpbih0YXJnZXRbcHJvcF0sIHNvdXJjZVtwcm9wXSwgZm9yY2UpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmaW5lKFsnbW9kdWxlJ10s
IGZ1bmN0aW9uIChtb2R1bGUpIHsKKyAgICAgICAgdmFyIG1hc3RlckNvbmZpZyA9M0QgbW9kdWxl
LmNvbmZpZyA/IG1vZHVsZS5jb25maWcoKSA6IHt9OworCisgICAgICAgIHJldHVybiB7CisgICAg
ICAgICAgICB2ZXJzaW9uOiAnMi4wLjQnLAorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAg
KiBDYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgbmVlZHMgdG8gYmUgbG9hZGVkLgorICAgICAgICAg
ICAgICovCisgICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAobmFtZSwgcmVxLCBvbkxvYWQsIGNv
bmZpZykgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9M0QgY29uZmlnIHx8IHt9OworCisgICAg
ICAgICAgICAgICAgaWYgKGNvbmZpZy5sb2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFz
dGVyQ29uZmlnLmxvY2FsZSA9M0QgY29uZmlnLmxvY2FsZTsKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB2YXIgbWFzdGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbWF0
Y2ggPTNEIG5sc1JlZ0V4cC5leGVjKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICBwcmVmaXgg
PTNEIG1hdGNoWzFdLAorICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPTNEIG1hdGNoWzRdLAor
ICAgICAgICAgICAgICAgICAgICBzdWZmaXggPTNEIG1hdGNoWzVdLAorICAgICAgICAgICAgICAg
ICAgICBwYXJ0cyA9M0QgbG9jYWxlLnNwbGl0KCItIiksCisgICAgICAgICAgICAgICAgICAgIHRv
TG9hZCA9M0QgW10sCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0zRCB7fSwKKyAgICAgICAg
ICAgICAgICAgICAgaSwgcGFydCwgY3VycmVudCA9M0QgIiI7CisKKyAgICAgICAgICAgICAgICAv
L0lmIG1hdGNoWzVdIGlzIGJsYW5rLCBpdCBtZWFucyB0aGlzIGlzIHRoZSB0b3AgYnVuZGxlIGRl
PQpmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAvL3NvIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUg
aGFuZGxlZC4gTG9jYWxlLXNwZWNpZmljIHJlcXVlPQpzdHMKKyAgICAgICAgICAgICAgICAvL3dp
bGwgaGF2ZSBhIG1hdGNoWzRdIHZhbHVlIGJ1dCBubyBtYXRjaFs1XQorICAgICAgICAgICAgICAg
IGlmIChtYXRjaFs1XSkgeworICAgICAgICAgICAgICAgICAgICAvL2xvY2FsZS1zcGVjaWZpYyBi
dW5kbGUKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0zRCBtYXRjaFsxXTsKKyAgICAgICAg
ICAgICAgICAgICAgbWFzdGVyTmFtZSA9M0QgcHJlZml4ICsgc3VmZml4OworICAgICAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vVG9wLWxldmVsIGJ1bmRsZS4KKyAg
ICAgICAgICAgICAgICAgICAgbWFzdGVyTmFtZSA9M0QgbmFtZTsKKyAgICAgICAgICAgICAgICAg
ICAgc3VmZml4ID0zRCBtYXRjaFs0XTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0zRCBt
YXN0ZXJDb25maWcubG9jYWxlOworICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0zRCBtYXN0ZXJDb25maWcubG9jYWxlID0z
RAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBuYXZpZ2F0b3IgPTNEPTNEPTNE
ICJ1bmRlZmluZWQiID8gInJvb3Q9CiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChu
YXZpZ2F0b3IubGFuZ3VhZ2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdh
dG9yLnVzZXJMYW5ndWFnZSB8fCAicm9vdCIpLnRvTG93ZXJDYXNlPQooKTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9M0QgbG9jYWxlLnNwbGl0KCIt
Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pc0J1
aWxkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhbGwg
bG9jYWxlIHBvc3NpYmxlIGZpbGVzIGFuZAorICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmUg
dGhlbSBpZiBleGlzdC4KKyAgICAgICAgICAgICAgICAgICAgdG9Mb2FkLnB1c2gobWFzdGVyTmFt
ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZElmRXhpc3RzKHJlcSwgInJvb3QiLCB0b0xvYWQs
IHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0zRCAwOyBpIDwg
cGFydHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPTNEIHBh
cnRzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCArPTNEIChjdXJyZW50ID8g
Ii0iIDogIiIpICsgcGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZElmRXhpc3RzKHJl
cSwgY3VycmVudCwgdG9Mb2FkLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgICAgICByZXEodG9Mb2FkLCBmdW5jdGlvbiAoKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBvbkxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy9GaXJzdCwgZmV0
Y2ggdGhlIG1hc3RlciBidW5kbGUsIGl0IGtub3dzIHdoYXQgbG9jYWxlPQpzIGFyZSBhdmFpbGFi
bGUuCisgICAgICAgICAgICAgICAgICAgIHJlcShbbWFzdGVyTmFtZV0sIGZ1bmN0aW9uIChtYXN0
ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlndXJlIG91dCB0aGUgYmVzdCBmaXQK
KyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZWVkZWQgPTNEIFtdLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHBhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQWx3YXlz
IGFsbG93IGZvciByb290LCB0aGVuIGRvIHRoZSByZXN0IG9mIHRoZSBsPQpvY2FsZSBwYXJ0cy4K
KyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcnQoInJvb3QiLCBtYXN0ZXIsIG5lZWRlZCwg
dG9Mb2FkLCBwcmVmaXgsIHN1PQpmZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAo
aSA9M0QgMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcGFydCA9M0QgcGFydHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vy
cmVudCArPTNEIChjdXJyZW50ID8gIi0iIDogIiIpICsgcGFydDsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBhZGRQYXJ0KGN1cnJlbnQsIG1hc3RlciwgbmVlZGVkLCB0b0xvYWQsIHByZWZp
PQp4LCBzdWZmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgICAgICAgICAvL0xvYWQgYWxsIHRoZSBwYXJ0cyBtaXNzaW5nLgorICAgICAgICAgICAgICAg
ICAgICAgICAgcmVxKHRvTG9hZCwgZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHZhciBpLCBwYXJ0QnVuZGxlLCBwYXJ0OworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZvciAoaSA9M0QgbmVlZGVkLmxlbmd0aCAtIDE7IGkgPiAtMSAmJiBuZWVkZWQ9CltpXTsg
aS0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPTNEIG5lZWRlZFtp
XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydEJ1bmRsZSA9M0QgbWFzdGVy
W3BhcnRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydEJ1bmRsZSA9
M0Q9M0Q9M0QgdHJ1ZSB8fCBwYXJ0QnVuZGw9CmUgPTNEPTNEPTNEIDEpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRCdW5kbGUgPTNEIHJlcShwcmVmaXggKyBwYXJ0
ICsgJy8nPQogKyBzdWZmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKHZhbHVlLCBwYXJ0QnVuZGxlKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvL0FsbCBkb25lLCBub3RpZnkgdGhlIGxvYWRlci4KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBvbkxvYWQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAg
ICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfTsKKyAgICB9KTsKK30oKSk7CgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFm
MGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRm
ZTAyY2IyIHN0YXRpYy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1iYXNlLmpzCi0tLSBhL3N0YXRp
Yy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1iYXNlLmpzCisrKyBiL3N0YXRpYy9zY3JpcHRzL212
Yy9kYXRhc2V0L2hkYS1iYXNlLmpzCkBAIC0xLDcgKzEsOCBAQAogZGVmaW5lKFsKICAgICAibXZj
L2RhdGFzZXQvaGRhLW1vZGVsIiwKLSAgICAibXZjL2Jhc2UtbXZjIgotXSwgZnVuY3Rpb24oIGhk
YU1vZGVsLCBiYXNlTVZDICl7CisgICAgIm12Yy9iYXNlLW12YyIsCisgICAgInV0aWxzL2xvY2Fs
aXphdGlvbiIKK10sIGZ1bmN0aW9uKCBoZGFNb2RlbCwgYmFzZU1WQywgX2wgKXsKIC8qIGdsb2Jh
bCBCYWNrYm9uZSAqLwogLy89M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0QKIC8qKiBAY2xhc3MgUmVhZCBvbmx5IHZpZXcg
Zm9yIEhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb24uCgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRk
YzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1
MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1lZGl0LmpzCi0tLSBh
L3N0YXRpYy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1lZGl0LmpzCisrKyBiL3N0YXRpYy9zY3Jp
cHRzL212Yy9kYXRhc2V0L2hkYS1lZGl0LmpzCkBAIC0yLDggKzIsOSBAQAogICAgICJtdmMvZGF0
YXNldC9oZGEtbW9kZWwiLAogICAgICJtdmMvZGF0YXNldC9oZGEtYmFzZSIsCiAgICAgIm12Yy90
YWdzIiwKLSAgICAibXZjL2Fubm90YXRpb25zIgotXSwgZnVuY3Rpb24oIGhkYU1vZGVsLCBoZGFC
YXNlLCB0YWdzTW9kLCBhbm5vdGF0aW9uc01vZCApeworICAgICJtdmMvYW5ub3RhdGlvbnMiLAor
ICAgICJ1dGlscy9sb2NhbGl6YXRpb24iCitdLCBmdW5jdGlvbiggaGRhTW9kZWwsIGhkYUJhc2Us
IHRhZ3NNb2QsIGFubm90YXRpb25zTW9kLCBfbCApewogLy89M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0QKIC8qKiBAY2xh
c3MgRWRpdGluZyB2aWV3IGZvciBIaXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLgogICogIEBuYW1l
IEhEQUVkaXRWaWV3CgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkz
YzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRp
Yy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1tb2RlbC5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9t
dmMvZGF0YXNldC9oZGEtbW9kZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvbXZjL2RhdGFzZXQv
aGRhLW1vZGVsLmpzCkBAIC0xLDYgKzEsNyBAQAogZGVmaW5lKFsKLSAgICAibXZjL2Jhc2UtbXZj
IgotXSwgZnVuY3Rpb24oIGJhc2VNVkMgKXsKKyAgICAibXZjL2Jhc2UtbXZjIiwKKyAgICAidXRp
bHMvbG9jYWxpemF0aW9uIgorXSwgZnVuY3Rpb24oIGJhc2VNVkMsIF9sICl7CiAvLz0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0z
RD0zRAogLyoqIEBjbGFzcyAoSERBKSBtb2RlbCBmb3IgYSBHYWxheHkgZGF0YXNldAogICogICAg
ICByZWxhdGVkIHRvIGEgaGlzdG9yeS4KCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYw
ZmM3OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZl
MDJjYjIgc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvYW5ub3RhdGVkLWhpc3RvcnktcGFuZWwu
anMKLS0tIGEvc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvYW5ub3RhdGVkLWhpc3RvcnktcGFu
ZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvYW5ub3RhdGVkLWhpc3Rvcnkt
cGFuZWwuanMKQEAgLTEsOCArMSw5IEBACiBkZWZpbmUoWwogICAgICJtdmMvZGF0YXNldC9oZGEt
bW9kZWwiLAogICAgICJtdmMvZGF0YXNldC9oZGEtYmFzZSIsCi0gICAgIm12Yy9oaXN0b3J5L3Jl
YWRvbmx5LWhpc3RvcnktcGFuZWwiCi1dLCBmdW5jdGlvbiggaGRhTW9kZWwsIGhkYUJhc2UsIHJl
YWRvbmx5UGFuZWwgKXsKKyAgICAibXZjL2hpc3RvcnkvcmVhZG9ubHktaGlzdG9yeS1wYW5lbCIs
CisgICAgInV0aWxzL2xvY2FsaXphdGlvbiIKK10sIGZ1bmN0aW9uKCBoZGFNb2RlbCwgaGRhQmFz
ZSwgcmVhZG9ubHlQYW5lbCwgX2wgKXsKIC8qID0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRAogVE9ETzoKPTIwCgpkaWZmIC1y
IDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2Vh
ZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL212Yy9oaXN0b3J5
L2N1cnJlbnQtaGlzdG9yeS1wYW5lbC5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9tdmMvaGlzdG9y
eS9jdXJyZW50LWhpc3RvcnktcGFuZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvbXZjL2hpc3Rv
cnkvY3VycmVudC1oaXN0b3J5LXBhbmVsLmpzCkBAIC0xLDggKzEsOSBAQAogZGVmaW5lKFsKICAg
ICAibXZjL2RhdGFzZXQvaGRhLWVkaXQiLAogICAgICJtdmMvaGlzdG9yeS9oaXN0b3J5LXBhbmVs
IiwKLSAgICAibXZjL2Jhc2UtbXZjIgotXSwgZnVuY3Rpb24oIGhkYUVkaXQsIGhwYW5lbCwgYmFz
ZU1WQyApeworICAgICJtdmMvYmFzZS1tdmMiLAorICAgICJ1dGlscy9sb2NhbGl6YXRpb24iCitd
LCBmdW5jdGlvbiggaGRhRWRpdCwgaHBhbmVsLCBiYXNlTVZDLCBfbCApewogLy8gPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNECiAv
Kiogc2Vzc2lvbiBzdG9yYWdlIGZvciBoaXN0b3J5IHBhbmVsIHByZWZlcmVuY2VzIChhbmQgdG8g
bWFpbnRhaW4gc3RhdGUpCiAgKi8KCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3
OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJj
YjIgc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvaGlzdG9yeS1tb2RlbC5qcwotLS0gYS9zdGF0
aWMvc2NyaXB0cy9tdmMvaGlzdG9yeS9oaXN0b3J5LW1vZGVsLmpzCisrKyBiL3N0YXRpYy9zY3Jp
cHRzL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKQEAgLTEsNyArMSw4IEBACiBkZWZpbmUo
WwogICAgICJtdmMvZGF0YXNldC9oZGEtbW9kZWwiLAotICAgICJtdmMvYmFzZS1tdmMiCi1dLCBm
dW5jdGlvbiggaGRhTW9kZWwsIGJhc2VNVkMgKXsKKyAgICAibXZjL2Jhc2UtbXZjIiwKKyAgICAi
dXRpbHMvbG9jYWxpemF0aW9uIgorXSwgZnVuY3Rpb24oIGhkYU1vZGVsLCBiYXNlTVZDLCBfbCAp
ewogLy89M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPQo9M0Q9M0Q9M0Q9M0QKIC8qKiBAY2xhc3MgTW9kZWwgZm9yIGEgR2FsYXh5IGhpc3Rvcnkg
cmVzb3VyY2UgLSBib3RoIGEgcmVjb3JkIG9mIHVzZXIKICAqICAgICAgdG9vbCB1c2UgYW5kIGEg
Y29sbGVjdGlvbiBvZiB0aGUgZGF0YXNldHMgdGhvc2UgdG9vbHMgcHJvZHVjZWQuCgpkaWZmIC1y
IDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2Vh
ZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL212Yy9oaXN0b3J5
L2hpc3RvcnktcGFuZWwuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvaGlzdG9y
eS1wYW5lbC5qcworKysgYi9zdGF0aWMvc2NyaXB0cy9tdmMvaGlzdG9yeS9oaXN0b3J5LXBhbmVs
LmpzCkBAIC0zLDggKzMsOSBAQAogICAgICJtdmMvZGF0YXNldC9oZGEtZWRpdCIsCiAgICAgIm12
Yy9oaXN0b3J5L3JlYWRvbmx5LWhpc3RvcnktcGFuZWwiLAogICAgICJtdmMvdGFncyIsCi0gICAg
Im12Yy9hbm5vdGF0aW9ucyIKLV0sIGZ1bmN0aW9uKCBoZGFNb2RlbCwgaGRhRWRpdCwgcmVhZG9u
bHlQYW5lbCwgdGFnc01vZCwgYW5ub3RhdGlvbnNNb2QgKXsKKyAgICAibXZjL2Fubm90YXRpb25z
IiwKKyAgICAidXRpbHMvbG9jYWxpemF0aW9uIgorXSwgZnVuY3Rpb24oIGhkYU1vZGVsLCBoZGFF
ZGl0LCByZWFkb25seVBhbmVsLCB0YWdzTW9kLCBhbm5vdGF0aW9uc01vZCwgX2w9CiApewogLyog
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNE
PTNEPTNEPTNECiBUT0RPOgo9MjAKCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3
OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJj
YjIgc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvcmVhZG9ubHktaGlzdG9yeS1wYW5lbC5qcwot
LS0gYS9zdGF0aWMvc2NyaXB0cy9tdmMvaGlzdG9yeS9yZWFkb25seS1oaXN0b3J5LXBhbmVsLmpz
CisrKyBiL3N0YXRpYy9zY3JpcHRzL212Yy9oaXN0b3J5L3JlYWRvbmx5LWhpc3RvcnktcGFuZWwu
anMKQEAgLTIsOCArMiw5IEBACiAgICAgIm12Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwiLAogICAg
ICJtdmMvZGF0YXNldC9oZGEtYmFzZSIsCiAgICAgIm12Yy91c2VyL3VzZXItbW9kZWwiLAotICAg
ICJtdmMvYmFzZS1tdmMiCi1dLCBmdW5jdGlvbiggaGlzdG9yeU1vZGVsLCBoZGFCYXNlLCB1c2Vy
TW9kZWwsIGJhc2VNVkMgKXsKKyAgICAibXZjL2Jhc2UtbXZjIiwKKyAgICAidXRpbHMvbG9jYWxp
emF0aW9uIgorXSwgZnVuY3Rpb24oIGhpc3RvcnlNb2RlbCwgaGRhQmFzZSwgdXNlck1vZGVsLCBi
YXNlTVZDLCBfbCApewogLy8gPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNECiAvKiogc2Vzc2lvbiBzdG9yYWdlIGZvciBpbmRpdmlk
dWFsIGhpc3RvcnkgcHJlZmVyZW5jZXMgKi8KIHZhciBIaXN0b3J5UHJlZnMgPTNEIGJhc2VNVkMu
U2Vzc2lvblN0b3JhZ2VNb2RlbC5leHRlbmQoewoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMw
MTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRjYzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEz
YWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9tdmMvdXNlci91c2VyLW1vZGVsLmpzCi0tLSBhL3N0
YXRpYy9zY3JpcHRzL212Yy91c2VyL3VzZXItbW9kZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMv
bXZjL3VzZXIvdXNlci1tb2RlbC5qcwpAQCAtMSw2ICsxLDcgQEAKIGRlZmluZShbCi0gICAgIm12
Yy9iYXNlLW12YyIKLV0sIGZ1bmN0aW9uKCBiYXNlTVZDICl7CisgICAgIm12Yy9iYXNlLW12YyIs
CisgICAgInV0aWxzL2xvY2FsaXphdGlvbiIKK10sIGZ1bmN0aW9uKCBiYXNlTVZDLCBfbCApewog
Ly89M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PQo9M0Q9M0Q9M0Q9M0QKIC8qKiBAY2xhc3MgTW9kZWwgZm9yIGEgR2FsYXh5IHVzZXIgKGluY2x1
ZGluZyBhbm9ueW1vdXMgdXNlcnMpLgogICogIEBuYW1lIFVzZXIKCmRpZmYgLXIgODM0NmVjNGJh
YTM5OTJmNGRjMDE2MWYwZmM3OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdj
Nz0KMzllMDUxM2FkZGZlMDJjYjIgc3RhdGljL3NjcmlwdHMvbXZjL3VzZXIvdXNlci1xdW90YW1l
dGVyLmpzCi0tLSBhL3N0YXRpYy9zY3JpcHRzL212Yy91c2VyL3VzZXItcXVvdGFtZXRlci5qcwor
KysgYi9zdGF0aWMvc2NyaXB0cy9tdmMvdXNlci91c2VyLXF1b3RhbWV0ZXIuanMKQEAgLTEsNiAr
MSw3IEBACiBkZWZpbmUoWwotICAgICJtdmMvYmFzZS1tdmMiCi1dLCBmdW5jdGlvbiggYmFzZU1W
QyApeworICAgICJtdmMvYmFzZS1tdmMiLAorICAgICJ1dGlscy9sb2NhbGl6YXRpb24iCitdLCBm
dW5jdGlvbiggYmFzZU1WQywgX2wgKXsKIC8vPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNECiAvKiogQGNsYXNzIFZpZXcg
dG8gZGlzcGxheSBhIHVzZXIncyBkaXNrL3N0b3JhZ2UgdXNhZ2UKICAqICAgICAgZWl0aGVyIGFz
IGEgcHJvZ3Jlc3MgYmFyIHJlcHJlc2VudGluZyB0aGUgcGVyY2VudGFnZSBvZiBhIHF1b3RhIHVz
PQplZAoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1y
IGRjYzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0
cy9ubHMvamEvbG9jYWxlLmpzCi0tLSAvZGV2L251bGwKKysrIGIvc3RhdGljL3NjcmlwdHMvbmxz
L2phL2xvY2FsZS5qcwpAQCAtMCwwICsxLDM4OSBAQAorLyoqIGphIGxvY2FsaXphdGlvbiAqLwor
ZGVmaW5lKHsKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjI0CisiQXJlIHlv
dSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgY3VycmVudCBoaXN0b3J5PyIgOgorIj1FNz04
Rj1CRT1FNT05Qz1BOD1FMz04MT1BRT1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1B
QT1FMz04Mz1CQz0KPUUzPTgyPTkyPUU2PUI2PTg4PUUzPTgxPTk5PUUzPTgxPTkzPUUzPTgxPUE4
PUUzPTgxPUFCPUU1PTkwPThDPUU2PTg0PThGPUUzPQo9ODE9OTc9RTM9ODE9QkU9RTM9ODE9OTk9
RTM9ODE9OEI9RUY9QkM9OUYiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286MzgK
KyJjb2xsYXBzZSBhbGwiIDoKKyI9RTM9ODE9OTk9RTM9ODE9Qjk9RTM9ODE9QTY9RTM9ODI9OTI9
RTM9ODE9OEE9RTM9ODI9OEE9RTM9ODE9OUY9RTM9ODE9OUY9Cj1FMz04Mj04MCIsCisKKy8vIHRl
bXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRlcy5tYWtvOjIKKyJIaXN0b3J5IEl0ZW0gQXR0
cmlidXRlcyIgOgorIj1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1C
Qz1FMz04Mj1BMj1FMz04Mj1BND1FMz04Mz04Nj0KPUUzPTgzPUEwPUU1PUE0PTg5PUU2PTk1PUIw
IiwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTkKKyJFZGl0
IEF0dHJpYnV0ZXMiIDoKKyI9RTU9QTQ9ODk9RTY9OTU9QjA9RTM9ODI9OTI9RTc9Qjc9QTg9RTk9
OUI9ODY9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0
dHJpYnV0ZXMubWFrbzo2NAorIlRoaXMgd2lsbCBpbnNwZWN0IHRoZSBkYXRhc2V0IGFuZCBhdHRl
bXB0IHRvIGNvcnJlY3QgdGhlIGFib3ZlIGNvbHVtbiB2YWw9CnVlcyBpZiB0aGV5IGFyZSBub3Qg
YWNjdXJhdGUuIiA6CisiPUUzPTgxPTkzPUUzPTgyPThDPUUzPTgxPUFGPUUzPTgzPTg3PUUzPTgz
PUJDPUUzPTgyPUJGPUUzPTgyPUJCPUUzPTgzPTgzPQo9RTM9ODM9ODg9RTM9ODI9OTI9RTg9QUE9
QkY9RTY9OUY9QkI9RTM9ODE9OTc9RTM9ODE9QTY9RTQ9Qjg9OEE9RTg9QTg9OTg9RTM9Cj04MT1B
RT1FMz04Mj1BQj1FMz04Mz1BOT1FMz04Mz1BMD1FMz04MT1BRT1FNT04MD1BND1FMz04Mj05Mj1F
ND1CRj1BRT1FNj1BRD0KPUEzPUUzPTgxPTk5PUUzPTgyPThCPUUzPTgxPTkzPUUzPTgxPUE4PUUz
PTgyPTkyPUU4PUE5PUE2PUUzPTgxPUJGPUUzPTgxPUJFPQo9RTM9ODE9OTk9RTM9ODA9ODIiLAor
CisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzo2OAorIlJlcXVpcmVk
IG1ldGFkYXRhIHZhbHVlcyBhcmUgbWlzc2luZy4gU29tZSBvZiB0aGVzZSB2YWx1ZXMgbWF5IG5v
dCBiZSBlZGk9CnRhYmxlIGJ5IHRoZSB1c2VyLiBTZWxlY3RpbmcgXCJBdXRvLWRldGVjdFwiIHdp
bGwgYXR0ZW1wdCB0byBmaXggdGhlc2UgdmFsdT0KZXMuIiA6CisiPUU1PUJGPTg1PUU4PUE2PTgx
PUUzPTgxPUFBPUUzPTgzPUExPUUzPTgyPUJGPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPQo9
RTM9ODE9QUU9RTU9ODA9QTQ9RTM9ODE9OEM9RTQ9Qjg9OEQ9RTY9OTg9OEU9RTM9ODE9QTc9RTM9
ODE9OTk9RTM9ODA9ODI9RTM9Cj04MT05RD1FMz04Mj04Qz1FMz04Mj04OT1FMz04MT1BRT1FMz04
MT04ND1FMz04MT04Rj1FMz04MT1BND1FMz04MT04Qj1FMz04MT0KPUFFPUU1PTgwPUE0PUUzPTgx
PUFGPUUzPTgzPUE2PUUzPTgzPUJDPUUzPTgyPUI2PUUzPTgxPUFCPUUzPTgyPTg4PUUzPTgxPUEz
PQo9RTM9ODE9QTY9RTc9Qjc9QTg9RTk9OUI9ODY9RTU9OEY9QUY9RTg9ODM9QkQ9RTM9ODE9QUI9
RTM9ODE9QUY9RTM9ODE9QUE9RTM9Cj04MT1BMz1FMz04MT1BNj1FMz04MT04ND1FMz04MT1CRT1F
Mz04MT05Qj1FMz04Mj05Mz1FMz04MD04Mj1FMz04MD04Qz1FOD04Nz0KPUFBPUU1PThCPTk1PUU1
PTg4PUE0PUU1PUFFPTlBPUUzPTgwPThEPUUzPTgyPTkyPUU5PTgxPUI4PUU2PThBPTlFPUUzPTgx
PTk5PQo9RTM9ODI9OEI9RTM9ODE9QTg9RTM9ODE9OUQ9RTM9ODI9OEM9RTM9ODI9ODk9RTM9ODE9
QUU9RTU9ODA9QTQ9RTM9ODI9OTI9RTM9Cj04MT05Rj1FMz04MT1BMD1FMz04MT05Nz1FMz04MT04
Rj1FMz04MT1BNz1FMz04MT04RD1FMz04Mj04Qj1FMz04MT04Qj1FMz04Mj0KPTgyPUUzPTgxPTk3
PUUzPTgyPThDPUUzPTgxPUJFPUUzPTgxPTlCPUUzPTgyPTkzPUUzPTgwPTgyIiwKKworLy8gdGVt
cGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286NzgKKyJDb252ZXJ0IHRvIG5ldyBm
b3JtYXQiIDoKKyI9RTY9OTY9QjA9RTM9ODE9OTc9RTM9ODE9ODQ9RTM9ODM9OTU9RTM9ODI9QTk9
RTM9ODM9QkM9RTM9ODM9OUU9RTM9ODM9ODM9Cj1FMz04Mz04OD1FMz04MT1BQj1FNT1BND04OT1F
Nj04Rj05Qj1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRf
YXR0cmlidXRlcy5tYWtvOjg0CisiQ29udmVydCB0byIgOgorIj1FNT1BND04OT1FNj04Rj05Qj1F
Mz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRl
cy5tYWtvOjk1CisiVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyBkYXRhc2V0IHdpdGggdGhlIGNvbnRl
bnRzIG9mIHRoaXMgZGF0YXNldCBjb252ZXJ0ZT0KZCB0byBhIG5ldyBmb3JtYXQuIiA6CisiPUU2
PTk2PUIwPUUzPTgxPTk3PUUzPTgxPTg0PUUzPTgzPTk1PUUzPTgyPUE5PUUzPTgzPUJDPUUzPTgz
PTlFPUUzPTgzPTgzPQo9RTM9ODM9ODg9RTM9ODE9QUI9RTU9QTQ9ODk9RTY9OEY9OUI9RTM9ODE9
OTc9RTM9ODE9OUY9RTM9ODM9ODc9RTM9ODM9QkM9RTM9Cj04Mj1CRj1FMz04Mj1CQj1FMz04Mz04
Mz1FMz04Mz04OD1FMz04Mj05Mj1FNj05Nj1CMD1FOD1BNj04Rj1FND1CRD05Qz1FNj04OD0KPTkw
PUUzPTgxPTk3PUUzPTgxPUJFPUUzPTgxPTk5PUUzPTgwPTgyIiwKKworLy8gdGVtcGxhdGVzL2Rh
dGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTExCisiQ2hhbmdlIGRhdGEgdHlwZSIgOgorIj1F
Mz04Mz04Nz1FMz04Mz1CQz1FMz04Mj1CRj1FMz04Mj1CRj1FMz04Mj1BND1FMz04Mz05Nz1FMz04
Mj05Mj1FNT1BND04OT0KPUU2PTlCPUI0PUUzPTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVtcGxh
dGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTE3CisiTmV3IFR5cGUiIDoKKyI9RTY9
OTY9QjA9RTM9ODE9OTc9RTM9ODE9ODQ9RTM9ODI9QkY9RTM9ODI9QTQ9RTM9ODM9OTciLAorCisv
LyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzoxMjQKKyJUaGlzIHdpbGwg
Y2hhbmdlIHRoZSBkYXRhdHlwZSBvZiB0aGUgZXhpc3RpbmcgZGF0YXNldCBidXQgPGk+bm90PC9p
PiBtb2RpPQpmeSBpdHMgY29udGVudHMuIFVzZSB0aGlzIGlmIEdhbGF4eSBoYXMgaW5jb3JyZWN0
bHkgZ3Vlc3NlZCB0aGUgdHlwZSBvZiB5b3U9CnIgZGF0YXNldC4iIDoKKyI9RTM9ODE9OTM9RTM9
ODI9OEM9RTM9ODE9QUY9RTY9OTc9QTI9RTU9QUQ9OTg9RTM9ODE9QUU9RTM9ODM9ODc9RTM9ODM9
QkM9Cj1FMz04Mj1CRj1FMz04Mj1CQj1FMz04Mz04Mz1FMz04Mz04OD1FMz04MT1BRT1FMz04Mz04
Nz1FMz04Mz1CQz1FMz04Mj1CRj1FMz0KPTgyPUJGPUUzPTgyPUE0PUUzPTgzPTk3PUUzPTgyPTky
PUU1PUE0PTg5PUU2PTlCPUI0PUUzPTgxPTk3PUUzPTgxPUJFPUUzPTgxPQo9OTk9RTM9ODA9ODI9
RTM9ODE9OTc9RTM9ODE9OEI9RTM9ODE9OTc9RTM9ODM9ODc9RTM9ODM9QkM9RTM9ODI9QkY9RTM9
ODI9QkI9Cj1FMz04Mz04Mz1FMz04Mz04OD1FMz04MT1BRT1FND1COD1BRD1FOD1CQT1BQj1FMz04
MT1BRj1FNT1BND04OT1FNj05Qj1CND1FMz0KPTgxPTk3PUUzPTgxPUJFPUUzPTgxPTlCPUUzPTgy
PTkzPUUzPTgwPTgyPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPUUzPTgyPQo9QkI9RTM9ODM9
ODM9RTM9ODM9ODg9RTM9ODE9QUU9RTM9ODI9QkY9RTM9ODI9QTQ9RTM9ODM9OTc9RTM9ODE9QUU9
RTg9QUE9QTQ9Cj1FNT04OD1BND1FNT1BRT05QT1FMz04MT04Qz1FMz04MT04Mj1FMz04MT1BMz1F
Mz04MT05Rj1FMz04MT1BOD1FMz04MT04RD1FMz0KPTgxPUFCPUU0PUJEPUJGPUU3PTk0PUE4PUUz
PTgxPTk3PUUzPTgxPUJFPUUzPTgxPTk5PUUzPTgwPTgyIiwKKworLy8gdGVtcGxhdGVzL2RhdGFz
ZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTM3CisiQ29weSBIaXN0b3J5IEl0ZW0iIDoKKyI9RTM9
ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9RTM9ODM9QkM9RTM9ODI9QTI9RTM9ODI9
QTQ9RTM9ODM9ODY9Cj1FMz04Mz1BMD1FMz04Mj05Mj1FMz04Mj1CMz1FMz04Mz05ND1FMz04Mz1C
Qz1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoz
CisiWW91ciBzYXZlZCBoaXN0b3JpZXMiIDoKKyI9RTQ9QkY9OUQ9RTU9QUQ9OTg9RTM9ODE9OTc9
RTM9ODE9OUY9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9Cj1FMz04Mz1CQyIs
CisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoxOQorIlN0b3JlZCBIaXN0b3JpZXMi
IDoKKyI9RTY9QTA9QkM9RTc9QjQ9OEQ9RTM9ODE9OTc9RTM9ODE9QTY9RTM9ODE9ODI9RTM9ODI9
OEI9RTM9ODM9OTI9RTM9ODI9Qjk9Cj1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQyIsCisKKy8v
IHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoyMSB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1h
a286MjM5CisiaGlkZSBkZWxldGVkIiA6CisiPUU1PTg5PThBPUU5PTk5PUE0PUUzPTgxPTk3PUUz
PTgxPTlGPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgzPTg4PUUzPTgzPUFBPQo9RTM9ODM9QkM9RTM9
ODI9OTI9RTk9OUE9QTA9RTM9ODE9OTkiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1h
a286MjMKKyJzaG93IGRlbGV0ZWQiIDoKKyI9RTU9ODk9OEE9RTk9OTk9QTQ9RTM9ODE9OTc9RTM9
ODE9OUY9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9Cj1FMz04Mz1CQz1FMz04
Mj05Mj1FOD1BMT1BOD1FNz1BND1CQT1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRl
cy9oaXN0b3J5L2xpc3QubWFrbzoyNworIk5hbWUiIDoKKyI9RTU9OTA9OEQ9RTU9ODk9OEQiLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MjcKKyJTaXplIiA6CisiPUUzPTgyPUI1
PUUzPTgyPUE0PUUzPTgyPUJBIiwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjI3
CisiTGFzdCBtb2RpZmllZCIgOgorIj1FNj05Qz04MD1FNz1CNT04Mj1FNj05Qj1CND1FNj05Nj1C
MD1FNj05Nz1BNSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoyNworIkFjdGlv
bnMiIDoKKyI9RTY9OTM9OEQ9RTQ9QkQ9OUMiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0
Lm1ha286NDUKKyJyZW5hbWUiIDoKKyI9RTU9OTA9OEQ9RTc9QTc9QjA9RTU9QTQ9ODk9RTY9OUI9
QjQ9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286
NDYKKyJzd2l0Y2ggdG8iIDoKKyI9RTU9QTQ9ODk9RTY9OUI9QjQ9RTM9ODE9OTk9RTM9ODI9OEIi
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NDcKKyJkZWxldGUiIDoKKyI9RTU9
ODk9OEE9RTk9OTk9QTQ9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9y
eS9saXN0Lm1ha286NDkKKyJ1bmRlbGV0ZSIgOgorIj1FNT04OT04QT1FOT05OT1BND1FMz04MT04
Qj1FMz04Mj04OT1FNj04OD1CQj1FMz04MT05OSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xp
c3QubWFrbzo1NQorIkFjdGlvbiIgOgorIj1FNj05Mz04RD1FND1CRD05QyIsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1NiB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286
MjEKKyJTaGFyZSIgOgorIj1FNT04NT1CMT1FNj05Qz04OSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0
b3J5L2xpc3QubWFrbzo1NiB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MTUKKyJSZW5h
bWUiIDoKKyI9RTU9OTA9OEQ9RTc9QTc9QjA9RTU9QTQ9ODk9RTY9OUI9QjQ9RTM9ODE9OTk9RTM9
ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NTYgdGVtcGxhdGVzL2hp
c3Rvcnkvb3B0aW9ucy5tYWtvOjI0CisiRGVsZXRlIiA6CisiPUU1PTg5PThBPUU5PTk5PUE0PUUz
PTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjU4Cisi
VW5kZWxldGUiIDoKKyI9RTU9ODk9OEE9RTk9OTk9QTQ9RTM9ODE9OEI9RTM9ODI9ODk9RTY9ODg9
QkI9RTM9ODE9OTkiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NjUKKyJZb3Ug
aGF2ZSBubyBzdG9yZWQgaGlzdG9yaWVzIiA6CisiPUU0PUJGPTlEPUU3PUFFPUExPUUzPTgxPTk3
PUUzPTgxPUE2PUUzPTgxPTgyPUUzPTgyPThCPUUzPTgzPTkyPUUzPTgyPUI5PQo9RTM9ODM9ODg9
RTM9ODM9QUE9RTM9ODM9QkM9RTM9ODE9QUY9RTM9ODE9ODI9RTM9ODI9OEE9RTM9ODE9QkU9RTM9
ODE9OUI9RTM9Cj04Mj05MyIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzo1
CisiSGlzdG9yeSBPcHRpb25zIiA6CisiPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgzPTg4PUUzPTgz
PUFBPUUzPTgzPUJDPUUzPTgyPUFBPUUzPTgzPTk3PUUzPTgyPUI3PQo9RTM9ODM9QTc9RTM9ODM9
QjMiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286OQorIllvdSBtdXN0IGJl
ICIgOgorIj1FMz04MT04Mj1FMz04MT1BQT1FMz04MT05Rj1FMz04MT1BRiIsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzo5CisibG9nZ2VkIGluIiA6CisiPUUzPTgzPUFEPUUz
PTgyPUIwPUUzPTgyPUE0PUUzPTgzPUIzIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9u
cy5tYWtvOjkKKyIgdG8gc3RvcmUgb3Igc3dpdGNoIGhpc3Rvcmllcy4iIDoKKyI9RTM9ODE9OTc9
RTM9ODE9QUE9RTM9ODE9ODQ9RTM9ODE9QTg9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9
ODM9QUE9Cj1FMz04Mz1CQz1FMz04MT1BRT1FND1CRj05RD1FNz1BRT1BMT1FMz04Mj04ND1FNT1B
ND04OT1FNj05Qj1CND1FMz04MT04Qz1FMz0KPTgxPUE3PUUzPTgxPThEPUUzPTgxPUJFPUUzPTgx
PTlCPUUzPTgyPTkzPUUzPTgwPTgyIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5t
YWtvOjE1CisvLyBweXRob24tZm9ybWF0CisiIGN1cnJlbnQgaGlzdG9yeSAoc3RvcmVkIGFzIFwi
JXNcIikiIDoKKyIgPUU3PThGPUJFPUU1PTlDPUE4PUUzPTgxPUFFPUUzPTgzPTkyPUUzPTgyPUI5
PUUzPTgzPTg4PUUzPTgzPUFBPUUzPTgzPUJDPQo9RUY9QkM9ODhcIiVzXCIgPUUzPTgxPUE4PUUz
PTgxPTk3PUUzPTgxPUE2PUU0PUJGPTlEPUU3PUFFPUExPUUzPTgxPTk1PUUzPQo9ODI9OEM9RTM9
ODE9QTY9RTM9ODE9ODQ9RTM9ODE9QkU9RTM9ODE9OTk9RUY9QkM9ODkiLAorCisvLyB0ZW1wbGF0
ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MTYKKyJMaXN0IiA6CisiPUUzPTgzPUFBPUUzPTgyPUI5
PUUzPTgzPTg4PUUzPTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0
aW9ucy5tYWtvOjE2CisiIHByZXZpb3VzbHkgc3RvcmVkIGhpc3RvcmllcyIgOgorIiA9RTQ9QkI9
QTU9RTU9ODk9OEQ9RTM9ODE9QUI9RTQ9QkY9OUQ9RTc9QUU9QTE9RTM9ODE9OTc9RTM9ODE9OUY9
RTM9ODM9OTI9Cj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQyIsCisKKy8vIHRl
bXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzoxOAorIkNyZWF0ZSIgOgorIj1FND1CRD05Qz1F
Nj04OD05MD1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlv
bnMubWFrbzoxOAorIiBhIG5ldyBlbXB0eSBoaXN0b3J5IiA6CisiID1FNj05Nj1CMD1FOD1BNj04
Rj1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQyIsCisKKy8vIHRl
bXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzoyMAorIkNvbnN0cnVjdCB3b3JrZmxvdyIgOgor
Ij1FMz04Mz1BRj1FMz04Mz1CQz1FMz04Mj1BRj1FMz04Mz05NT1FMz04Mz1BRD1FMz04Mz1CQz1F
Mz04Mj05Mj1FNj1BNz04Qj0KPUU3PUFGPTg5PUUzPTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVt
cGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIwCisiIGZyb20gdGhlIGN1cnJlbnQgaGlzdG9y
eSIgOgorIiA9RTc9OEY9QkU9RTU9OUM9QTg9RTM9ODE9QUU9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9
ODM9ODg9RTM9ODM9QUE9RTM9ODM9QkM9Cj1FMz04MT04Qj1FMz04Mj04OSIsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzoyMSB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1h
a286MjQKKyIgY3VycmVudCBoaXN0b3J5IiA6CisiID1FNz04Rj1CRT1FNT05Qz1BOD1FMz04MT1B
RT1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQz0KIiwKKworLy8g
dGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIzCisiU2hvdyBkZWxldGVkIiA6CisiPUU1
PTg5PThBPUU5PTk5PUE0PUUzPTgxPTk3PUUzPTgxPTlGPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgz
PTg4PUUzPTgzPUFBPQo9RTM9ODM9QkM9RTM9ODI9OTI9RTg9QTE9QTg9RTc9QTQ9QkE9RTM9ODE9
OTk9RTM9ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjMKKyIg
ZGF0YXNldHMgaW4gaGlzdG9yeSIgOgorIiA9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9
ODM9QUE9RTM9ODM9QkM9RTM9ODE9QUU9RTM9ODM9ODc9RTM9ODM9QkM9Cj1FMz04Mj1CRj1FMz04
Mj1CQj1FMz04Mz04Mz1FMz04Mz04OCIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3JlbmFtZS5t
YWtvOjMgdGVtcGxhdGVzL2hpc3RvcnkvcmVuYW1lLm1ha286NgorIlJlbmFtZSBIaXN0b3J5IiA6
CisiPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgzPTg4PUUzPTgzPUFBPUUzPTgzPUJDPUUzPTgxPUFF
PUU1PTkwPThEPUU3PUE3PUIwPQo9RTU9QTQ9ODk9RTY9OUI9QjQ9RTM9ODI9OTI9RTM9ODE9OTk9
RTM9ODI9OEIiLAorCisKKyJSZW5hbWUgSGlzdG9yaWVzIiA6CisiPUU1PTkwPThEPUU3PUE3PUIw
PUU1PUE0PTg5PUU2PTlCPUI0PUUzPTgxPTk5PUUzPTgyPThCIiwKKworIlBlcmZvcm0gQWN0aW9u
IiA6CisiPUU2PTkzPThEPUU0PUJEPTlDPUUzPTgyPTkyPUU1PUFFPTlGPUU4PUExPThDPUUzPTgx
PTk5PUUzPTgyPThCIiwKKworIlN1Ym1pdCIgOgorIj1FNz05OT1CQj1FOT04Qz1CMj1FMz04MT05
OT1FMz04Mj04QiIsCisKKworCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9yZW5hbWUubWFrbzoxMAor
IkN1cnJlbnQgTmFtZSIgOgorIj1FNz04Rj1CRT1FNT05Qz1BOD1FMz04MT1BRT1FNT05MD04RD1F
Nz1BNz1CMCIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3JlbmFtZS5tYWtvOjEwCisiTmV3IE5h
bWUiIDoKKyI9RTY9OTY9QjA9RTM9ODE9OTc9RTM9ODE9ODQ9RTU9OTA9OEQ9RTc9QTc9QjAiLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtvOjMKKyJTaGFyZSBoaXN0b3JpZXMiIDoK
KyI9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9RTM9ODM9QkM9RTM9ODI9OTI9
RTU9ODU9QjE9RTY9OUM9ODk9Cj1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9o
aXN0b3J5L3NoYXJlLm1ha286NgorIlNoYXJlIEhpc3RvcmllcyIgOgorIj1FMz04Mz05Mj1FMz04
Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQz1FMz04Mj05Mj1FNT04NT1CMT1FNj05Qz04
OT0KPUUzPTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUubWFr
bzo5CisiSGlzdG9yeSBOYW1lOiIgOgorIj1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04
Mz1BQT1FMz04Mz1CQz1FNT05MD04RCIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1h
a286OQorIk51bWJlciBvZiBEYXRhc2V0czoiIDoKKyI9RTM9ODM9ODc9RTM9ODM9QkM9RTM9ODI9
QkY9RTM9ODI9QkI9RTM9ODM9ODM9RTM9ODM9ODg9RTY9OTU9QjAiLAorCisvLyB0ZW1wbGF0ZXMv
aGlzdG9yeS9zaGFyZS5tYWtvOjkKKyJTaGFyZSBMaW5rIiA6CisiPUU1PTg1PUIxPUU2PTlDPTg5
PUUzPTgzPUFBPUUzPTgzPUIzPUUzPTgyPUFGIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hh
cmUubWFrbzoxNQorIlRoaXMgaGlzdG9yeSBjb250YWlucyBubyBkYXRhLiIgOgorIj1FMz04MT05
Mz1FMz04MT1BRT1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQz1F
Mz04MT1BQj0KPUUzPTgxPUFGPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPUUzPTgxPThDPUUz
PTgxPTgyPUUzPTgyPThBPUUzPTgxPUJFPUUzPQo9ODE9OUI9RTM9ODI9OTM9RTM9ODA9ODIiLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtvOjIxCisiY29weSBsaW5rIHRvIHNoYXJl
IiA6CisiPUU1PTg1PUIxPUU2PTlDPTg5PUUzPTgzPUFBPUUzPTgzPUIzPUUzPTgyPUFGPUUzPTgy
PTkyPUUzPTgyPUIzPUUzPTgzPTk0PQo9RTM9ODM9QkM9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisv
LyB0ZW1wbGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtvOjI0CisiRW1haWwgb2YgVXNlciB0byBzaGFy
ZSB3aXRoOiIgOgorIj1FNT04NT1CMT1FNj05Qz04OT1FMz04MT05Nz1FMz04MT05Rj1FMz04MT04
ND1FMz04Mz1BNj1FMz04Mz1CQz1FMz04Mj1CNj0KPUUzPTgxPUFFRT1FMz04Mz1BMT1FMz04Mz1C
Qz1FMz04Mz1BQjoiLAorLy8iPUUzPTgxPUE0PUUzPTgxPThFPUUzPTgxPUFFPUUzPTgzPTkyPUUz
PTgyPUI5PUUzPTgzPTg4PUUzPTgzPUFBPUUzPTgzPQo9QkM9RTM9ODI9OTI9RTU9ODU9QjE9RTY9
OUM9ODk9RTM9ODE9OTk9RTM9ODI9OEI9RTM9ODM9QTY9RTM9ODM9QkM9RTM9ODI9QjY9Cj1FMz04
MT1BRUU9RTM9ODM9QTE9RTM9ODM9QkM9RTM9ODM9QUI9RTM9ODI9QTI9RTM9ODM9ODk9RTM9ODM9
QUM9RTM9ODI9Qjk6IgorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286NworIkdhbGF4
eSBIaXN0b3J5IiA6CisiR2FsYXh5ID1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1B
QT1FMz04Mz1CQyIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnkubWFrbzoyMzcKKyJyZWZy
ZXNoIiA6CisiPUUzPTgzPUFBPUUzPTgzPTk1PUUzPTgzPUFDPUUzPTgzPTgzPUUzPTgyPUI3PUUz
PTgzPUE1IiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeS5tYWtvOjI0NQorIllvdSBhcmUg
Y3VycmVudGx5IHZpZXdpbmcgYSBkZWxldGVkIGhpc3RvcnkhIiA6CisiPUU2PUI2PTg4PUU1PThF
PUJCPUUzPTgxPTk3PUUzPTgxPTlGPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgzPTg4PUUzPTgzPUFB
PQo9RTM9ODM9QkM9RTM9ODI9OTI9RTM9ODE9QkY9RTM9ODE9QTY9RTM9ODE9ODQ9RTM9ODE9QkU9
RTM9ODE9OTk9RTM9ODA9ODIiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286Mjg5
CisiWW91ciBoaXN0b3J5IGlzIGVtcHR5LiBDbGljayAnR2V0IERhdGEnIG9uIHRoZSBsZWZ0IHBh
bmUgdG8gc3RhcnQiIDoKKyI9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9RTM9
ODM9QkM9RTM9ODE9QUY9RTc9QTk9QkE9RTM9ODE9QTc9Cj1FMz04MT05OT1FMz04MD04Mj1FOD1B
Nz1BMz1FNj05RT05MD1FMz04Mj05Mj1FMz04MT1BRj1FMz04MT05OD1FMz04Mj04MT1FMz0KPTgy
PThCPUUzPTgxPUFCPUUzPTgxPUFGPUUzPTgwPTgxPUU1PUI3PUE2PUUzPTgzPTkxPUUzPTgzPThE
PUUzPTgzPUFCPUUzPTgxPQo9QUUgJz1FMz04Mz04Nz1FMz04Mz1CQz1FMz04Mj1CRj1FNT04Rj05
Nj1FNT1CRT05NycgPUUzPTgyPTkyPUUzPTgyPUFGPUUzPQo9ODM9QUE9RTM9ODM9ODM9RTM9ODI9
QUYiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQxCisiSm9iIGlz
IHdhaXRpbmcgdG8gcnVuIiA6CisiPUUzPTgyPUI4PUUzPTgzPUE3PUUzPTgzPTk2PUUzPTgxPUFG
PUU1PUFFPTlGPUU4PUExPThDPUU1PUJFPTg1PUUzPTgxPUExPQo9RTM9ODE9QTc9RTM9ODE9OTki
LAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQzCisiSm9iIGlzIGN1
cnJlbnRseSBydW5uaW5nIiA6CisiPUUzPTgyPUI4PUUzPTgzPUE3PUUzPTgzPTk2PUUzPTgxPUFG
PUU1PUFFPTlGPUU4PUExPThDPUU0PUI4PUFEPUUzPTgxPUE3PQo9RTM9ODE9OTkiLAorCisvLyB0
ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQ2CisiQW4gZXJyb3Igb2NjdXJyZWQg
cnVubmluZyB0aGlzIGpvYjogIiA6CisiPUUzPTgxPTkzPUUzPTgxPUFFPUUzPTgyPUI4PUUzPTgz
PUE3PUUzPTgzPTk2PUUzPTgxPUFFPUU1PUFFPTlGPUU4PUExPThDPQo9RTQ9Qjg9QUQ9RTM9ODE9
QUI9RTc9OTk9QkE9RTc9OTQ9OUY9RTM9ODE9OTc9RTM9ODE9OUY9RTM9ODI9QTg9RTM9ODM9QTk9
RTM9Cj04Mz1CQzogIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeV9jb21tb24ubWFrbzo0
NworInJlcG9ydCB0aGlzIGVycm9yIiA6CisiPUUzPTgxPTkzPUUzPTgxPUFFPUUzPTgyPUE4PUUz
PTgzPUE5PUUzPTgzPUJDPUUzPTgyPTkyPUU1PUEwPUIxPUU1PTkxPThBPQo9RTM9ODE9OTk9RTM9
ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjU0CisiTm8g
ZGF0YTogIiA6CisiPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPUU3PTg0PUExPUUzPTgxPTk3
OiAiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjU4CisiZm9ybWF0
OiAiIDoKKyI9RTM9ODM9OTU9RTM9ODI9QTk9RTM9ODM9QkM9RTM9ODM9OUU9RTM9ODM9ODM9RTM9
ODM9ODg6ICIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NTkKKyJk
YXRhYmFzZTogIiA6CisiPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPUUzPTgzPTk5PUUzPTgz
PUJDPUUzPTgyPUI5OiAiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtv
OjY2IHRlbXBsYXRlcy9yb290L21hc3RoZWFkLm1ha286MjAKKyJJbmZvOiAiIDoKKyI9RTY9ODM9
ODU9RTU9QTA9QjE6ICIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286
ODUKKy8vIHB5dGhvbi1mb3JtYXQKKyJFcnJvcjogdW5rbm93biBkYXRhc2V0IHN0YXRlIFwiJXNc
Ii4iIDoKKyI9RTM9ODI9QTg9RTM9ODM9QTk9RTM9ODM9QkM6ID1FND1COD04RD1FNj05OD04RT1F
Mz04MT1BQT1FMz04Mz04Nz1FMz04Mz0KPUJDPUUzPTgyPUJGPUU3PThBPUI2PUU2PTg1PThCIFwi
JXNcIj1FMz04MD04MiIsCisKKy8vIHRlbXBsYXRlcy9yb290L2luZGV4Lm1ha286MzIKKyJPcHRp
b25zIiA6CisiPUUzPTgyPUFBPUUzPTgzPTk3PUUzPTgyPUI3PUUzPTgzPUE3PUUzPTgzPUIzIiwK
KworLy8gdGVtcGxhdGVzL3Jvb3QvaW5kZXgubWFrbzozNAorIkhpc3RvcnkiIDoKKyI9RTM9ODM9
OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9RTM9ODM9QkMiLAorCisvLyB0ZW1wbGF0ZXMv
cm9vdC9tYXN0aGVhZC5tYWtvOjIwCisicmVwb3J0IGJ1Z3MiIDoKKyI9RTM9ODM9OTA9RTM9ODI9
QjA9RTM9ODI9OTI9RTU9QTA9QjE9RTU9OTE9OEE9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisvLyB0
ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjIxCisid2lraSIgOgorIndpa2kiLAorCisvLyB0
ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjIyCisic2NyZWVuY2FzdHMiIDoKKyI9RTM9ODI9
Qjk9RTM9ODI9QUY9RTM9ODM9QUE9RTM9ODM9QkM9RTM9ODM9QjM9RTM9ODI9QUQ9RTM9ODM9QTM9
RTM9ODI9Qjk9Cj1FMz04Mz04OCIsCisKKy8vIHRlbXBsYXRlcy9yb290L21hc3RoZWFkLm1ha286
MjMKKyJibG9nIiA6CisiPUUzPTgzPTk2PUUzPTgzPUFEPUUzPTgyPUIwIiwKKworLy8gdGVtcGxh
dGVzL3Jvb3QvbWFzdGhlYWQubWFrbzozMQorLy8gcHl0aG9uLWZvcm1hdAorIkxvZ2dlZCBpbiBh
cyAlczogIiA6CisiJXMgPUUzPTgxPUE4PUUzPTgxPTk3PUUzPTgxPUE2PUUzPTgzPUFEPUUzPTgy
PUIwPUUzPTgyPUE0PUUzPTgzPUIzPUU0PUI4PQo9QUQ6ICIsCisKKy8vIHRlbXBsYXRlcy9yb290
L21hc3RoZWFkLm1ha286MzEKKyJtYW5hZ2UiIDoKKyI9RTc9QUU9QTE9RTc9OTA9ODYiLAorCisv
LyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjMyCisibG9nb3V0IiA6CisiPUUzPTgzPUFE
PUUzPTgyPUIwPUUzPTgyPUEyPUUzPTgyPUE2PUUzPTgzPTg4IiwKKworLy8gdGVtcGxhdGVzL3Jv
b3QvbWFzdGhlYWQubWFrbzozNAorIkFjY291bnQ6ICIgOgorIj1FMz04Mj1BMj1FMz04Mj1BQj1F
Mz04Mj1BNj1FMz04Mz1CMz1FMz04Mz04ODogIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvbWFzdGhl
YWQubWFrbzozNAorImNyZWF0ZSIgOgorIj1FND1CRD05Qz1FNj04OD05MCIsCisKKy8vIHRlbXBs
YXRlcy9yb290L21hc3RoZWFkLm1ha286MzUKKyJsb2dpbiIgOgorIj1FMz04Mz1BRD1FMz04Mj1C
MD1FMz04Mj1BND1FMz04Mz1CMyIsCisKKy8vIHRlbXBsYXRlcy9yb290L3Rvb2xfbWVudS5tYWtv
OjUyCisiR2FsYXh5IFRvb2xzIiA6CisiR2FsYXh5ID1FMz04Mz04ND1FMz04Mz1CQz1FMz04Mz1B
Qj1FNz1CRT1BNCIsCisKKy8vIHRlbXBsYXRlcy9yb290L3Rvb2xfbWVudS5tYWtvOjEyOQorIldv
cmtmbG93IiA6CisiPUUzPTgzPUFGPUUzPTgzPUJDPUUzPTgyPUFGPUUzPTgzPTk1PUUzPTgzPUFE
PUUzPTgzPUJDIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvdG9vbF9tZW51Lm1ha286MTM0CisiTWFu
YWdlIiA6CisiPUU3PUFFPUExPUU3PTkwPTg2IiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvdG9vbF9t
ZW51Lm1ha286MTM0Cisid29ya2Zsb3dzIiA6CisiPUUzPTgzPUFGPUUzPTgzPUJDPUUzPTgyPUFG
PUUzPTgzPTk1PUUzPTgzPUFEPUUzPTgzPUJDIiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgu
bWFrbzoyIHRlbXBsYXRlcy91c2VyL2luZGV4Lm1ha286NAorIkFjY291bnQgc2V0dGluZ3MiIDoK
KyI9RTM9ODI9QTI9RTM9ODI9QUI9RTM9ODI9QTY9RTM9ODM9QjM9RTM9ODM9ODg9RTg9QTg9QUQ9
RTU9QUU9OUEiLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjcKKy8vIHB5dGhvbi1m
b3JtYXQKKyJZb3UgYXJlIGN1cnJlbnRseSBsb2dnZWQgaW4gYXMgJXMuIiA6CisiJXMgPUUzPTgx
PUE4PUUzPTgxPTk3PUUzPTgxPUE2PUUzPTgzPUFEPUUzPTgyPUIwPUUzPTgyPUE0PUUzPTgzPUIz
PUU0PUI4PQo9QUQ9RTM9ODA9ODIiLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjkK
KyJDaGFuZ2UgeW91ciBwYXNzd29yZCIgOgorIj1FMz04Mz05MT1FMz04Mj1COT1FMz04Mz1BRj1F
Mz04Mz1CQz1FMz04Mz04OT1FNT1BND04OT1FNj05Qj1CNCIsCisKKy8vIHRlbXBsYXRlcy91c2Vy
L2luZGV4Lm1ha286MTAKKyJVcGRhdGUgeW91ciBlbWFpbCBhZGRyZXNzIiA6CisiPUUzPTgzPUEx
PUUzPTgzPUJDPUUzPTgzPUFCPUUzPTgyPUEyPUUzPTgzPTg5PUUzPTgzPUFDPUUzPTgyPUI5PUU1
PUE0PTg5PQo9RTY9OUI9QjQiLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjExCisi
TG9nb3V0IiA6CisiPUUzPTgzPUFEPUUzPTgyPUIwPUUzPTgyPUEyPUUzPTgyPUE2PUUzPTgzPTg4
IiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzoxNgorIkxvZ2luIiA6CisiPUUzPTgz
PUFEPUUzPTgyPUIwPUUzPTgyPUE0PUUzPTgzPUIzIiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5k
ZXgubWFrbzoxNworIkNyZWF0ZSBuZXcgYWNjb3VudCIgOgorIj1FNj05Nj1CMD1FOD1BNj04Rj1F
Mz04Mj1BMj1FMz04Mj1BQj1FMz04Mj1BNj1FMz04Mz1CMz1FMz04Mz04OD1FMz04Mj05Mj0KPUU0
PUJEPTlDPUU2PTg4PTkwPUUzPTgxPTk5PUUzPTgyPThCIgorCit9KQoKZGlmZiAtciA4MzQ2ZWM0
YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRjYzBjMTkxNDdlYWQ4NmM2ZTM1
N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9ubHMvbG9jYWxlLmpzCi0tLSAv
ZGV2L251bGwKKysrIGIvc3RhdGljL3NjcmlwdHMvbmxzL2xvY2FsZS5qcwpAQCAtMCwwICsxLDUx
NyBAQAorLyoqIGVuL21haW4gbG9jYWxpemF0aW9uIGhhc2ggLSBmb3IgdXNlIHdpdGggcmVxdWly
ZWpzJyBpMThuIHBsdWdpbiAqLworZGVmaW5lKHsKKyAgICByb290IDogeworLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS09Ci0tLS0tIGxvY2FsaXplZAorImhpc3RvcnkiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0
ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjQKKyJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVs
ZXRlIHRoZSBjdXJyZW50IGhpc3Rvcnk/IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL3Jvb3Qv
aGlzdG9yeS5tYWtvOjM4CisiY29sbGFwc2UgYWxsIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVz
L2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MgorIkhpc3RvcnkgSXRlbSBBdHRyaWJ1dGVz
IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286
MTkKKyJFZGl0IEF0dHJpYnV0ZXMiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9l
ZGl0X2F0dHJpYnV0ZXMubWFrbzo2NAorIlRoaXMgd2lsbCBpbnNwZWN0IHRoZSBkYXRhc2V0IGFu
ZCBhdHRlbXB0IHRvIGNvcnJlY3QgdGhlIGFib3ZlIGNvbHVtbiB2YWw9CnVlcyBpZiB0aGV5IGFy
ZSBub3QgYWNjdXJhdGUuIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9h
dHRyaWJ1dGVzLm1ha286NjgKKyJSZXF1aXJlZCBtZXRhZGF0YSB2YWx1ZXMgYXJlIG1pc3Npbmcu
IFNvbWUgb2YgdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgZWRpPQp0YWJsZSBieSB0aGUgdXNlci4g
U2VsZWN0aW5nIFwiQXV0by1kZXRlY3RcIiB3aWxsIGF0dGVtcHQgdG8gZml4IHRoZXNlIHZhbHU9
CmVzLiIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRlcy5t
YWtvOjc4CisiQ29udmVydCB0byBuZXcgZm9ybWF0IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVz
L2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286ODQKKyJDb252ZXJ0IHRvIiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286OTUKKyJUaGlzIHdp
bGwgY3JlYXRlIGEgbmV3IGRhdGFzZXQgd2l0aCB0aGUgY29udGVudHMgb2YgdGhpcyBkYXRhc2V0
IGNvbnZlcnRlPQpkIHRvIGEgbmV3IGZvcm1hdC4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMv
ZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzoxMTEKKyJDaGFuZ2UgZGF0YSB0eXBlIiA6Citm
YWxzZSwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTE3Cisi
TmV3IFR5cGUiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0
ZXMubWFrbzoxMjQKKyJUaGlzIHdpbGwgY2hhbmdlIHRoZSBkYXRhdHlwZSBvZiB0aGUgZXhpc3Rp
bmcgZGF0YXNldCBidXQgPGk+bm90PC9pPiBtb2RpPQpmeSBpdHMgY29udGVudHMuIFVzZSB0aGlz
IGlmIEdhbGF4eSBoYXMgaW5jb3JyZWN0bHkgZ3Vlc3NlZCB0aGUgdHlwZSBvZiB5b3U9CnIgZGF0
YXNldC4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMu
bWFrbzoxMzcKKyJDb3B5IEhpc3RvcnkgSXRlbSIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9o
aXN0b3J5L2xpc3QubWFrbzozCisiWW91ciBzYXZlZCBoaXN0b3JpZXMiIDoKK2ZhbHNlLAorCisv
LyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MTkKKyJTdG9yZWQgSGlzdG9yaWVzIiA6Citm
YWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjIxIHRlbXBsYXRlcy9yb290
L2hpc3RvcnkubWFrbzoyMzkKKyJoaWRlIGRlbGV0ZWQiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0
ZXMvaGlzdG9yeS9saXN0Lm1ha286MjMKKyJzaG93IGRlbGV0ZWQiIDoKK2ZhbHNlLAorCisvLyB0
ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MjcKKyJOYW1lIiA6CitmYWxzZSwKKworLy8gdGVt
cGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjI3CisiU2l6ZSIgOgorZmFsc2UsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L2xpc3QubWFrbzoyNworIkxhc3QgbW9kaWZpZWQiIDoKK2ZhbHNlLAorCisv
LyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MjcKKyJBY3Rpb25zIiA6CitmYWxzZSwKKwor
Ly8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjQ1CisicmVuYW1lIiA6CitmYWxzZSwKKwor
Ly8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjQ2Cisic3dpdGNoIHRvIiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjQ3CisiZGVsZXRlIiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjQ5CisidW5kZWxldGUiIDoKK2ZhbHNl
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NTUKKyJBY3Rpb24iIDoKK2ZhbHNl
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NTYgdGVtcGxhdGVzL2hpc3Rvcnkv
b3B0aW9ucy5tYWtvOjIxCisiU2hhcmUiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9y
eS9saXN0Lm1ha286NTYgdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjE1CisiUmVuYW1l
IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjU2IHRlbXBsYXRl
cy9oaXN0b3J5L29wdGlvbnMubWFrbzoyNAorIkRlbGV0ZSIgOgorZmFsc2UsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1OAorIlVuZGVsZXRlIiA6CitmYWxzZSwKKworLy8gdGVt
cGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjY1CisiWW91IGhhdmUgbm8gc3RvcmVkIGhpc3Rvcmll
cyIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzo1CisiSGlz
dG9yeSBPcHRpb25zIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5t
YWtvOjkKKyJZb3UgbXVzdCBiZSAiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9v
cHRpb25zLm1ha286OQorImxvZ2dlZCBpbiIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0
b3J5L29wdGlvbnMubWFrbzo5CisiIHRvIHN0b3JlIG9yIHN3aXRjaCBoaXN0b3JpZXMuIiA6Citm
YWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjE1CisvLyBweXRob24t
Zm9ybWF0CisiIGN1cnJlbnQgaGlzdG9yeSAoc3RvcmVkIGFzIFwiJXNcIikiIDoKK2ZhbHNlLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MTYKKyJMaXN0IiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjE2CisiIHByZXZpb3VzbHkgc3Rv
cmVkIGhpc3RvcmllcyIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMu
bWFrbzoxOAorIkNyZWF0ZSIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlv
bnMubWFrbzoxOAorIiBhIG5ldyBlbXB0eSBoaXN0b3J5IiA6CitmYWxzZSwKKworLy8gdGVtcGxh
dGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIwCisiQ29uc3RydWN0IHdvcmtmbG93IiA6CitmYWxz
ZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIwCisiIGZyb20gdGhlIGN1
cnJlbnQgaGlzdG9yeSIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMu
bWFrbzoyMSB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjQKKyIgY3VycmVudCBoaXN0
b3J5IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIzCisi
U2hvdyBkZWxldGVkIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5t
YWtvOjIzCisiIGRhdGFzZXRzIGluIGhpc3RvcnkiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMv
aGlzdG9yeS9yZW5hbWUubWFrbzozIHRlbXBsYXRlcy9oaXN0b3J5L3JlbmFtZS5tYWtvOjYKKyJS
ZW5hbWUgSGlzdG9yeSIgOgorZmFsc2UsCisKKworIlJlbmFtZSBIaXN0b3JpZXMiIDoKK2ZhbHNl
LAorCisiUGVyZm9ybSBBY3Rpb24iIDoKK2ZhbHNlLAorCisiU3VibWl0IiA6CitmYWxzZSwKKwor
Ly8gdGVtcGxhdGVzL2hpc3RvcnkvcmVuYW1lLm1ha286MTAKKyJDdXJyZW50IE5hbWUiIDoKK2Zh
bHNlLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9yZW5hbWUubWFrbzoxMAorIk5ldyBOYW1lIiA6
CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUubWFrbzozCisiU2hhcmUgaGlz
dG9yaWVzIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUubWFrbzo2Cisi
U2hhcmUgSGlzdG9yaWVzIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUu
bWFrbzo5CisiSGlzdG9yeSBOYW1lOiIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5
L3NoYXJlLm1ha286OQorIk51bWJlciBvZiBEYXRhc2V0czoiIDoKK2ZhbHNlLAorCisvLyB0ZW1w
bGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtvOjkKKyJTaGFyZSBMaW5rIiA6CitmYWxzZSwKKworLy8g
dGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUubWFrbzoxNQorIlRoaXMgaGlzdG9yeSBjb250YWlucyBu
byBkYXRhLiIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286MjEK
KyJjb3B5IGxpbmsgdG8gc2hhcmUiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9z
aGFyZS5tYWtvOjI0CisiRW1haWwgb2YgVXNlciB0byBzaGFyZSB3aXRoOiIgOgorZmFsc2UsCisK
Ky8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnkubWFrbzo3CisiR2FsYXh5IEhpc3RvcnkiIDoKK2Zh
bHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286MjM3CisicmVmcmVzaCIgOgor
ZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnkubWFrbzoyNDUKKyJZb3UgYXJlIGN1
cnJlbnRseSB2aWV3aW5nIGEgZGVsZXRlZCBoaXN0b3J5ISIgOgorZmFsc2UsCisKKy8vIHRlbXBs
YXRlcy9yb290L2hpc3RvcnkubWFrbzoyODkKKyJZb3VyIGhpc3RvcnkgaXMgZW1wdHkuIENsaWNr
ICdHZXQgRGF0YScgb24gdGhlIGxlZnQgcGFuZSB0byBzdGFydCIgOgorZmFsc2UsCisKKy8vIHRl
bXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NDEKKyJKb2IgaXMgd2FpdGluZyB0byBy
dW4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQz
CisiSm9iIGlzIGN1cnJlbnRseSBydW5uaW5nIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL3Jv
b3QvaGlzdG9yeV9jb21tb24ubWFrbzo0NgorIkFuIGVycm9yIG9jY3VycmVkIHJ1bm5pbmcgdGhp
cyBqb2I6ICIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1h
a286NDcKKyJyZXBvcnQgdGhpcyBlcnJvciIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290
L2hpc3RvcnlfY29tbW9uLm1ha286NTQKKyJObyBkYXRhOiAiIDoKK2ZhbHNlLAorCisvLyB0ZW1w
bGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjU4CisiZm9ybWF0OiAiIDoKK2ZhbHNlLAor
CisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjU5CisiZGF0YWJhc2U6ICIg
OgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NjYgdGVt
cGxhdGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMAorIkluZm86ICIgOgorZmFsc2UsCisKKy8vIHRl
bXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286ODUKKy8vIHB5dGhvbi1mb3JtYXQKKyJF
cnJvcjogdW5rbm93biBkYXRhc2V0IHN0YXRlIFwiJXNcIi4iIDoKK2ZhbHNlLAorCisvLyB0ZW1w
bGF0ZXMvcm9vdC9pbmRleC5tYWtvOjMyCisiT3B0aW9ucyIgOgorZmFsc2UsCisKKy8vIHRlbXBs
YXRlcy9yb290L2luZGV4Lm1ha286MzQKKyJIaXN0b3J5IiA6CitmYWxzZSwKKworLy8gdGVtcGxh
dGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMAorInJlcG9ydCBidWdzIiA6CitmYWxzZSwKKworLy8g
dGVtcGxhdGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMQorIndpa2kiIDoKK2ZhbHNlLAorCisvLyB0
ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjIyCisic2NyZWVuY2FzdHMiIDoKK2ZhbHNlLAor
CisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjIzCisiYmxvZyIgOgorZmFsc2UsCisK
Ky8vIHRlbXBsYXRlcy9yb290L21hc3RoZWFkLm1ha286MzEKKy8vIHB5dGhvbi1mb3JtYXQKKyJM
b2dnZWQgaW4gYXMgJXM6ICIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L21hc3RoZWFk
Lm1ha286MzEKKyJtYW5hZ2UiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVh
ZC5tYWtvOjMyCisibG9nb3V0IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL3Jvb3QvbWFzdGhl
YWQubWFrbzozNAorIkFjY291bnQ6ICIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L21h
c3RoZWFkLm1ha286MzQKKyJjcmVhdGUiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9t
YXN0aGVhZC5tYWtvOjM1CisibG9naW4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC90
b29sX21lbnUubWFrbzo1MgorIkdhbGF4eSBUb29scyIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRl
cy9yb290L3Rvb2xfbWVudS5tYWtvOjEyOQorIldvcmtmbG93IiA6CitmYWxzZSwKKworLy8gdGVt
cGxhdGVzL3Jvb3QvdG9vbF9tZW51Lm1ha286MTM0CisiTWFuYWdlIiA6CitmYWxzZSwKKworLy8g
dGVtcGxhdGVzL3Jvb3QvdG9vbF9tZW51Lm1ha286MTM0Cisid29ya2Zsb3dzIiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzoyIHRlbXBsYXRlcy91c2VyL2luZGV4Lm1h
a286NAorIkFjY291bnQgc2V0dGluZ3MiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9p
bmRleC5tYWtvOjcKKy8vIHB5dGhvbi1mb3JtYXQKKyJZb3UgYXJlIGN1cnJlbnRseSBsb2dnZWQg
aW4gYXMgJXMuIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzo5Cisi
Q2hhbmdlIHlvdXIgcGFzc3dvcmQiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRl
eC5tYWtvOjEwCisiVXBkYXRlIHlvdXIgZW1haWwgYWRkcmVzcyIgOgorZmFsc2UsCisKKy8vIHRl
bXBsYXRlcy91c2VyL2luZGV4Lm1ha286MTEKKyJMb2dvdXQiIDoKK2ZhbHNlLAorCisvLyB0ZW1w
bGF0ZXMvdXNlci9pbmRleC5tYWtvOjE2CisiTG9naW4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0
ZXMvdXNlci9pbmRleC5tYWtvOjE3CisiQ3JlYXRlIG5ldyBhY2NvdW50IiA6CitmYWxzZSwKKwor
CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLT0KLS0tLS0gbmVlZCB0byBiZSBsb2NhbGl6ZWQKKyJhbm9ueW1v
dXMgdXNlciIgOgorZmFsc2UsCisKKyJVc2luZyAiIDoKK2ZhbHNlLAorCisiVGhlcmUgd2FzIGFu
IGVycm9yIGdldHRpbmcgdGhlIGRhdGEgZm9yIHRoaXMgZGF0YXNldCIgOgorZmFsc2UsCisKKyJU
aGlzIGRhdGFzZXQgaGFzIGJlZW4gZGVsZXRlZCBhbmQgcmVtb3ZlZCBmcm9tIGRpc2suIiA6Citm
YWxzZSwKKworIlRoaXMgZGF0YXNldCBoYXMgYmVlbiBkZWxldGVkLiIgOgorZmFsc2UsCisKKyJU
aGlzIGRhdGFzZXQgaGFzIGJlZW4gaGlkZGVuLiIgOgorZmFsc2UsCisKKyJmb3JtYXQiIDoKK2Zh
bHNlLAorCisiZGF0YWJhc2UiIDoKK2ZhbHNlLAorCisiVGhpcyBoaXN0b3J5IGlzIGVtcHR5IiA6
CitmYWxzZSwKKworIk5vIG1hdGNoaW5nIGRhdGFzZXRzIGZvdW5kIiA6CitmYWxzZSwKKworIllv
dSBhcmUgb3ZlciB5b3VyIGRpc2sgcXVvdGEuIiA6CitmYWxzZSwKKworIlRvb2wgZXhlY3V0aW9u
IGlzIG9uIGhvbGQgdW50aWwgeW91ciBkaXNrIHVzYWdlIGRyb3BzIGJlbG93IHlvdXIgYWxsb2Nh
dGU9CmQgcXVvdGEuIiA6CitmYWxzZSwKKworIkFsbCIgOgorZmFsc2UsCisKKyJOb25lIiA6Citm
YWxzZSwKKworIkZvciBhbGwgc2VsZWN0ZWQiIDoKK2ZhbHNlLAorCisiVGhpcyBoaXN0b3J5IGlz
IGVtcHR5LiBDbGljayAnR2V0IERhdGEnIG9uIHRoZSBsZWZ0IHRvb2wgbWVudSB0byBzdGFydCIg
OgorZmFsc2UsCisKKyJJbmNsdWRlIERlbGV0ZWQgRGF0YXNldHMiIDoKK2ZhbHNlLAorCisiSW5j
bHVkZSBIaWRkZW4gRGF0YXNldHMiIDoKK2ZhbHNlLAorCisiRWRpdCBoaXN0b3J5IHRhZ3MiIDoK
K2ZhbHNlLAorCisiRWRpdCBoaXN0b3J5IEFubm90YXRpb24iIDoKK2ZhbHNlLAorCisiT3BlcmF0
aW9ucyBvbiBtdWx0aXBsZSBkYXRhc2V0cyIgOgorZmFsc2UsCisKKyJTZWFyY2ggZGF0YXNldHMi
IDoKK2ZhbHNlLAorCisiY2xlYXIgc2VhcmNoIChlc2MpIiA6CitmYWxzZSwKKworImxvYWRpbmcu
Li4iIDoKK2ZhbHNlLAorCisiSGlkZSBkYXRhc2V0cyIgOgorZmFsc2UsCisKKyJVbmhpZGUgZGF0
YXNldHMiIDoKK2ZhbHNlLAorCisiRGVsZXRlIGRhdGFzZXRzIiA6CitmYWxzZSwKKworIlVuZGVs
ZXRlIGRhdGFzZXRzIiA6CitmYWxzZSwKKworIlBlcm1hbmVudGx5IGRlbGV0ZSBkYXRhc2V0cyIg
OgorZmFsc2UsCisKKyJDbGljayB0byByZW5hbWUgaGlzdG9yeSIgOgorZmFsc2UsCisKKyJWaWV3
IGRhdGEiIDoKK2ZhbHNlLAorCisiRWRpdCBhdHRyaWJ1dGVzIiA6CitmYWxzZSwKKworIlZpZXcg
ZGV0YWlscyIgOgorZmFsc2UsCisKKyJSdW4gdGhpcyBqb2IgYWdhaW4iIDoKK2ZhbHNlLAorCisi
RWRpdCBkYXRhc2V0IHRhZ3MiIDoKK2ZhbHNlLAorCisiRWRpdCBkYXRhc2V0IGFubm90YXRpb24i
IDoKK2ZhbHNlLAorCisiIENsaWNrIDxhIGhyZWY9M0RcImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBj
bGFzcz0zRFwiZGF0YXNldC11bmRlbGV0ZVwiPmhlcj0KZTwvYT4gdG8gdW5kZWxldGUgaXQgb3Ig
PGEgaHJlZj0zRFwiamF2YXNjcmlwdDp2b2lkKDApO1wiIGNsYXNzPTNEXCJkYXRhc2V0PQotcHVy
Z2VcIj5oZXJlPC9hPiB0byBpbW1lZGlhdGVseSByZW1vdmUgaXQgZnJvbSBkaXNrIiA6CitmYWxz
ZSwKKworIiBDbGljayA8YSBocmVmPTNEXCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgY2xhc3M9M0Rc
ImRhdGFzZXQtdW5oaWRlXCI+aGVyZTw9Ci9hPiB0byB1bmhpZGUgaXQiIDoKK2ZhbHNlLAorCisi
RG93bmxvYWQiIDoKK2ZhbHNlLAorCisiVmlzdWFsaXplIiA6CitmYWxzZQorCisKKy8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tPQotLS0tLQorfSwKKyAgICAnamEnICA6IHRydWUsCisgICAgJ3poJyAgOiB0cnVl
Cit9KTsKCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3OWEwYmE4OTNjMGE2MyAt
ciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJjYjIgc3RhdGljL3Njcmlw
dHMvbmxzL3poL2xvY2FsZS5qcwotLS0gL2Rldi9udWxsCisrKyBiL3N0YXRpYy9zY3JpcHRzL25s
cy96aC9sb2NhbGUuanMKQEAgLTAsMCArMSw1NzAgQEAKKy8qKiB6aCBsb2NhbGl6YXRpb24gKi8K
K2RlZmluZSh7CisKKy8vIHRlbXBsYXRlcy9iYXNlX3BhbmVscy5tYWtvOjUKKyJHYWxheHkiIDoK
KyJHYWxheHkiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjQKKyJBcmUg
eW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGhpc3Rvcnk/IiA6CisiPUU3
PUExPUFFPUU4PUFFPUE0PUU4PUE2PTgxPUU1PTg4PUEwPUU5PTk5PUE0PUU1PUJEPTkzPUU1PTg5
PThEPUU3PTlBPTg0PQo9RTU9OEU9ODY9RTU9OEY9QjI9RTg9QUU9QjA9RTU9QkQ9OTU9RTU9OTA9
OTc9RUY9QkM9OUYiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286MzgKKyJjb2xs
YXBzZSBhbGwiIDoKKyI9RTU9ODU9QTg9RTk9ODM9QTg9RTY9OTQ9QjY9RTc9QkM9QTkiLAorCisv
LyB0ZW1wbGF0ZXMvcm9vdC9pbmRleC5tYWtvOjUKKyJUb29scyIgOgorIj1FNT1CNz1BNT1FNT04
NT1CNyIsCisKKworLy8gdG9vbHMvKioueG1sCisiR2V0IERhdGEiIDoKKyI9RTg9OEU9Qjc9RTU9
OEY9OTY9RTY9OTU9QjA9RTY9OEQ9QUUiLAorCisiR2V0IEVOQ09ERSBEYXRhIiA6CisiPUU4PThF
PUI3PUU1PThGPTk2RU5DT0RFPUU2PTk1PUIwPUU2PThEPUFFIiwKKworIkVOQ09ERSBUb29scyIg
OgorIkVOQ09ERT1FNT1CNz1BNT1FNT04NT1CNyIsCisKKyJMaWZ0LU92ZXIiIDoKKyI9RTc9ODk9
ODg9RTY9OUM9QUM9RTg9QkQ9QUM9RTY9OEQ9QTIiLAorCisiVGV4dCBNYW5pcHVsYXRpb24iIDoK
KyI9RTY9OTY9ODc9RTY9OUM9QUM9RTY9OTM9OEQ9RTQ9QkQ9OUMiLAorCisiRmlsdGVyIGFuZCBT
b3J0IiA6CisiPUU4PUJGPTg3PUU2PUJCPUE0PUU1PTkyPThDPUU2PThFPTkyPUU1PUJBPThGIiwK
KworIkpvaW4sIFN1YnRyYWN0IGFuZCBHcm91cCIgOgorIj1FNz1CQj05Mz1FNT05MD04OD1FRj1C
Qz04Qz1FNT1CNz1BRT1FOT05Qj04Nj1FND1COD04RT1FNT04OD04Nj1FNz1CQj04NCIsCisKKyJD
b252ZXJ0IEZvcm1hdHMiIDoKKyI9RTY9QTA9QkM9RTU9QkM9OEY9RTg9QkQ9QUM9RTY9OEQ9QTIi
LAorCisiRXh0cmFjdCBGZWF0dXJlcyIgOgorIj1FNz04OT1COT1FNT1CRT04MT1FNj04Rj05MD1F
NT04Rj05NiIsCisKKyJGZXRjaCBTZXF1ZW5jZXMiIDoKKyI9RTg9OEU9Qjc9RTU9OEY9OTY9RTU9
QkE9OEY9RTU9ODg9OTciLAorCisiRmV0Y2ggQWxpZ25tZW50cyIgOgorIj1FOD04RT1CNz1FNT04
Rj05Nj1FNj1BRj05ND1FNT1BRj1COT1FND1COD04QT1FNz05QT04ND1FNT1CQT04Rj1FNT04OD05
NyIsCisKKyJHZXQgR2Vub21pYyBTY29yZXMiIDoKKyI9RTg9OEU9Qjc9RTU9QkU9OTc9RTU9OUY9
QkE9RTU9OUI9QTA9RTc9QkI9ODQ9RTU9ODg9ODY9RTY9OTU9QjAiLAorCisiT3BlcmF0ZSBvbiBH
ZW5vbWljIEludGVydmFscyIgOgorIj1FNT05Rj1CQT1FNT05Qj1BMD1FNz1CQj04ND1FNT04Qz1C
QT1FOT05Nz1CND1FNj05Mz04RD1FND1CRD05QyIsCisKKyJTdGF0aXN0aWNzIiA6CisiPUU3PUJC
PTlGPUU4PUFFPUExPUU5PTg3PThGIiwKKworIkdyYXBoL0Rpc3BsYXkgRGF0YSIgOgorIj1FNT05
Qj1CRT1FNT1CRD1BMj1FRj1CQz04Rj1FNj05NT1CMD1FNj04RD1BRSIsCisKKyJSZWdpb25hbCBW
YXJpYXRpb24iIDoKKyI9RTU9OEM9QkE9RTU9OUY9OUY9RTU9QTQ9OUE9RTY9ODA9ODE9RTY9ODA9
QTciLAorCisiRXZvbHV0aW9uOiBIeVBoeSIgOgorIj1FOD1CRj05Qj1FNT04Qz05NjogSHlQaHki
LAorCisiVGF4b25vbXkgbWFuaXB1bGF0aW9uIiA6CisiPUU1PTg4PTg2PUU3PUIxPUJCPUU1PUE0
PTg0PUU3PTkwPTg2IiwKKworIlNvbGV4YSB0b29scyIgOgorIlNvbGV4YT1FNT1CNz1BNT1FNT04
NT1CNyIsCisKKyJGQVNUQSBtYW5pcHVsYXRpb24iIDoKKyJGQVNUQT1FNT1BND04ND1FNz05MD04
NiIsCisKKyJTaG9ydCBSZWFkIFFDIGFuZCBNYW5pcHVsYXRpb24iIDoKKyI9RTc9OUY9QUQ9RTc9
ODk9ODc9RTY9QUU9QjU9RTY9OTU9QjA9RTY9OEQ9QUU9RTg9QjQ9QTg9RTk9ODc9OEY9RTY9OEU9
QTc9Cj1FNT04OD1CNj1FNT04Rj04QT1FNT1BND04ND1FNz05MD04NiIsCisKKyJTaG9ydCBSZWFk
IE1hcHBpbmciIDoKKyI9RTc9OUY9QUQ9RTc9ODk9ODc9RTY9QUU9QjU9RTU9OUI9OUU9RTg9QjQ9
QjQiLAorCisKKy8vIHRlbXBsYXRlcy9hZG1pbl9tYWluLm1ha286MyB0ZW1wbGF0ZXMvYWRtaW5f
bWFpbi5tYWtvOjgKKyJHYWxheHkgQWRtaW5pc3RyYXRpb24iIDoKKyJHYWxheHkgPUU3PUFFPUEx
PUU3PTkwPTg2IiwKKworLy8gdGVtcGxhdGVzL2FkbWluX21haW4ubWFrbzoxNworIkFkbWluIHBh
c3N3b3JkOiAiIDoKKyI9RTc9QUU9QTE9RTc9OTA9ODY9RTU9OTE9OTg9RTU9QUY9ODY9RTc9QTA9
ODE6ICIsCisKKy8vIHRlbXBsYXRlcy9hZG1pbl9tYWluLm1ha286MTkKKyJSZWxvYWQgdG9vbDog
IiA6CisiPUU5PTg3PThEPUU2PTk2PUIwPUU4PUJEPUJEPUU1PTg1PUE1PUU1PUI3PUE1PUU1PTg1
PUI3IiwKKworLy8gdGVtcGxhdGVzL2FkbWluX21haW4ubWFrbzozNQorIlJlbG9hZCIgOgorIj1F
OT04Nz04RD1FNj05Nj1CMD1FOD1CRD1CRD1FNT04NT1BNSIsCisKKy8vIHRlbXBsYXRlcy9kYXRh
c2V0L2VkaXRfYXR0cmlidXRlcy5tYWtvOjIKKyJIaXN0b3J5IEl0ZW0gQXR0cmlidXRlcyIgOgor
Ij1FNT04RT04Nj1FNT04Rj1CMj1FOT1BMT1COT1FNz05Qj1BRT1FNT1CMT05RT1FNj04MD1BNyIs
CisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRlcy5tYWtvOjE5CisiRWRpdCBh
dHRyaWJ1dGVzIiA6CisiPUU3PUJDPTk2PUU4PUJFPTkxPUU1PUIxPTlFPUU2PTgwPUE3IiwKKwor
Ly8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286NjQKKyJUaGlzIHdpbGwg
aW5zcGVjdCB0aGUgZGF0YXNldCBhbmQgYXR0ZW1wdCB0byBjb3JyZWN0IHRoZSBhYm92ZSBjb2x1
bW4gdmFsPQp1ZXMgaWYgdGhleSBhcmUgbm90IGFjY3VyYXRlLiIgOgorIj1FNj05NT1CMD1FNj04
RD1BRT1FOT05Qj04Nj1FNj1BMz04MD1FNj05Rj1BNT1FRj1CQz04Qz1FOD04Qj1BNT1FNj05Qz04
OT0KPUU5PTk0PTk5PUU4PUFGPUFGPUVGPUJDPThDPUU2PTlCPUI0PUU2PUFEPUEzPUU0PUI4PThB
PUU4PUJGPUIwPUU2PUEwPThGPUU0PQo9Qjg9QUQ9RTc9OUE9ODQ9RTU9ODA9QkM9RTM9ODA9ODIi
LAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzo2OAorIlJlcXVp
cmVkIG1ldGFkYXRhIHZhbHVlcyBhcmUgbWlzc2luZy4gU29tZSBvZiB0aGVzZSB2YWx1ZXMgbWF5
IG5vdCBiZSBlZGk9CnRhYmxlIGJ5IHRoZSB1c2VyLiBTZWxlY3RpbmcgXCJBdXRvLWRldGVjdFwi
IHdpbGwgYXR0ZW1wdCB0byBmaXggdGhlc2UgdmFsdT0KZXMuIiA6CisiPUU3PUJDPUJBPUU1PUIw
PTkxPUU2PTg5PTgwPUU5PTlDPTgwPUU3PTlBPTg0bWV0YWRhdGE9RTc9OUE9ODQ9RTU9ODA9QkM9
Cj1FMz04MD04Mj1FNz05ND1BOD1FNj04OD1CNz1FNT04Rj1BRj1FOD04Mz1CRD1FNj05Nz1BMD1F
Nj1CMz05NT1FNT1BRj1COT1FOD0KPUJGPTk5PUU0PUJBPTlCPUU1PTgwPUJDPUU4PUJGPTlCPUU4
PUExPThDPUU3PUJDPTk2PUU4PUJFPTkxPUUzPTgwPTgyPUU5PTgwPQo9ODk9RTY9OEI9QTk9RTI9
ODA9OUM9RTg9ODc9QUE9RTU9OEE9QTg9RTY9QTM9ODA9RTY9QjU9OEI9RTI9ODA9OUQ9RTY9OUQ9
QTU9Cj1FNT1CMD05RD1FOD1BRj05NT1FND1CRj1BRT1FNj1BRD1BMz1FOD1CRj05OT1FND1CQT05
Qj1FNT04MD1CQz1FMz04MD04MiIsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmli
dXRlcy5tYWtvOjc4CisiQ29udmVydCB0byBuZXcgZm9ybWF0IiA6CisiPUU4PUJEPUFDPUU2PThE
PUEyPUU0PUI4PUJBPUU2PTk2PUIwPUU2PUEwPUJDPUU1PUJDPThGIiwKKworLy8gdGVtcGxhdGVz
L2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286ODQKKyJDb252ZXJ0IHRvIiA6CisiPUU4PUJE
PUFDPUU2PThEPUEyPUU0PUI4PUJBIiwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRy
aWJ1dGVzLm1ha286OTUKKyJUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IGRhdGFzZXQgd2l0aCB0aGUg
Y29udGVudHMgb2YgdGhpcyBkYXRhc2V0IGNvbnZlcnRlPQpkIHRvIGEgbmV3IGZvcm1hdC4iIDoK
KyI9RTg9QkY9OTk9RTU9QjA9ODY9RTQ9QkE9QTc9RTc9OTQ9OUY9RTQ9Qjg9ODA9RTQ9Qjg9QUE9
RTg9QkQ9QUM9RTY9OEQ9QTI9Cj1FNj1BMD1CQz1FNT1CQz04Rj1FNT05MD04RT1FNz05QT04ND1F
Nj05Nj1CMD1FNj05NT1CMD1FNj04RD1BRT1FOT05Qj04Nj1FRj0KPUJDPThDIiwKKworLy8gdGVt
cGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTExCisiQ2hhbmdlIGRhdGEgdHlw
ZSIgOgorIj1FNj05ND1COT1FNT04Rj05OD1FNj05NT1CMD1FNj04RD1BRT1FNz1CMT1CQj1FNT05
RT04QiIsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRlcy5tYWtvOjExNwor
Ik5ldyBUeXBlIiA6CisiPUU2PTk2PUIwPUU3PUIxPUJCPUU1PTlFPThCIiwKKworLy8gdGVtcGxh
dGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTI0CisiVGhpcyB3aWxsIGNoYW5nZSB0
aGUgZGF0YXR5cGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFzZXQgYnV0IDxpPm5vdDwvaT4gbW9kaT0K
ZnkgaXRzIGNvbnRlbnRzLiBVc2UgdGhpcyBpZiBHYWxheHkgaGFzIGluY29ycmVjdGx5IGd1ZXNz
ZWQgdGhlIHR5cGUgb2YgeW91PQpyIGRhdGFzZXQuIiA6CisiPUU4PUJGPTk5PUU1PUIwPTg2PUU2
PTk0PUI5PUU1PThGPTk4PUU1PUI3PUIyPUU2PTlDPTg5PUU2PTk1PUIwPUU2PThEPUFFPQo9RTk9
OUI9ODY9RTc9OUE9ODQ9RTY9OTU9QjA9RTY9OEQ9QUU9RTc9QjE9QkI9RTU9OUU9OEI9RUY9QkM9
OEM9RTQ9QkQ9ODY8aT49Cj1FND1COD04RDwvaT49RTY9OTQ9Qjk9RTU9OEY9OTg9RTU9ODU9QjY9
RTU9ODY9ODU9RTU9QUU9Qjk9RTM9ODA9ODI9RTU9QkQ9Cj05M0dhbGF4eT1FND1COD04RD1FOD04
Mz1CRD1FNj1BRD1BMz1FNz1BMT1BRT1FNT04OD1BND1FNj05Nj1BRD1FND1CRD1BMD1FNz0KPTlB
PTg0PUU2PTk1PUIwPUU2PThEPUFFPUU3PUIxPUJCPUU1PTlFPThCPUU2PTk3PUI2PUVGPUJDPThD
PUU4PUFFPUJFPUU3PUJEPQo9QUU9RTg9QUY9QTU9RTU9OEY9ODI9RTY9OTU9QjA9RTM9ODA9ODIi
LAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzoxMzcKKyJDb3B5
IEhpc3RvcnkgSXRlbSIgOgorIj1FNT1BND04RD1FNT04OD1CNj1FNT04RT04Nj1FNT04Rj1CMj1F
OD1BRT1CMD1FNT1CRD05NT1FOT1BMT1COSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3Qu
bWFrbzozCisiU2F2ZWQgSGlzdG9yaWVzIiA6CisiPUU1PUI3PUIyPUU0PUJGPTlEPUU1PUFEPTk4
PUU3PTlBPTg0PUU1PThFPTg2PUU1PThGPUIyIiwKKworCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9s
aXN0Lm1ha286MjEgdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeS5tYWtvOjIzOQorImhpZGUgZGVsZXRl
ZCIgOgorIj1FOT05QT05MD1FOD05Nz04Rj1FNT1CNz1CMj1FNT04OD1BMD1FOT05OT1BND1FNz05
QT04ND1FNj05NT1CMD1FNj04RD1BRSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFr
bzoyMworInNob3cgZGVsZXRlZCIgOgorIj1FNj05OD1CRT1FNz1BND1CQT1FNT1CNz1CMj1FNT04
OD1BMD1FOT05OT1BND1FNz05QT04ND1FNj05NT1CMD1FNj04RD1BRSIsCisKKy8vIHRlbXBsYXRl
cy9oaXN0b3J5L2xpc3QubWFrbzoyNworIk5hbWUiIDoKKyI9RTU9OTA9OEQ9RTc9QTc9QjAiLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MjcKKyJTaXplIiA6CisiPUU1PUE0PUE3
PUU1PUIwPThGIiwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjI3CisiTGFzdCBt
b2RpZmllZCIgOgorIj1FNj05Qz04MD1FNT05MD04RT1FND1CRj1BRT1FNj05ND1COT1FNj05Nz1C
Nj1FOT05Nz1CNCIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoyNworIkFjdGlv
bnMiIDoKKyI9RTY9OTM9OEQ9RTQ9QkQ9OUMiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0
Lm1ha286NDUKKyJyZW5hbWUiIDoKKyI9RTk9ODc9OEQ9RTU9OTE9QkQ9RTU9OTA9OEQiLAorCisv
LyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NDYKKyJzd2l0Y2ggdG8iIDoKKyI9RTU9ODg9
ODc9RTY9OEQ9QTI9RTU9ODg9QjAiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286
NDcKKyJkZWxldGUiIDoKKyI9RTU9ODg9QTA9RTk9OTk9QTQiLAorCisvLyB0ZW1wbGF0ZXMvaGlz
dG9yeS9saXN0Lm1ha286NDkKKyJ1bmRlbGV0ZSIgOgorIj1FOD1CRj05OD1FNT04RT05RiIsCisK
Ky8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1NQorIkFjdGlvbiIgOgorIj1FNj05Mz04
RD1FND1CRD05QyIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1NiB0ZW1wbGF0
ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjEKKyJTaGFyZSIgOgorIj1FNT04NT1CMT1FND1CQT1B
QiIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1NiB0ZW1wbGF0ZXMvaGlzdG9y
eS9vcHRpb25zLm1ha286MTUKKyJSZW5hbWUiIDoKKyI9RTk9ODc9OEQ9RTU9OTE9QkQ9RTU9OTA9
OEQiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NTYgdGVtcGxhdGVzL2hpc3Rv
cnkvb3B0aW9ucy5tYWtvOjI0CisiRGVsZXRlIiA6CisiPUU1PTg4PUEwPUU5PTk5PUE0IiwKKwor
Ly8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjU4CisiVW5kZWxldGUiIDoKKyI9RTg9QkY9
OTg9RTU9OEU9OUYiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NjUKKyJZb3Ug
aGF2ZSBubyBzdG9yZWQgaGlzdG9yaWVzIiA6CisiPUU2PUIyPUExPUU2PTlDPTg5PUU1PUFEPTk4
PUU1PTgyPUE4PUU3PTlBPTg0PUU1PThFPTg2PUU1PThGPUIyPUU4PUFFPUIwPQo9RTU9QkQ9OTUi
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286NQorIkhpc3RvcnkgT3B0aW9u
cyIgOgorIj1FNT04RT04Nj1FNT04Rj1CMj1FOD1BRT1CMD1FNT1CRD05NT1FOT04MD04OT1FOT1B
MT1COSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzo5CisiWW91IG11c3Qg
YmUgIiA6CisiPUU0PUJEPUEwPUU1PUJGPTg1PUU5PUExPUJCPUU2PTg4PTkwPUU0PUI4PUJBIiwK
KworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjkKKyJsb2dnZWQgaW4iIDoKKyI9
RTc9OTk9QkI9RTU9QkQ9OTUiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286
OQorIiB0byBzdG9yZSBvciBzd2l0Y2ggaGlzdG9yaWVzLiIgOgorIj1FND1CQj1BNT1FNT1BRD05
OD1FNT04Mj1BOD1FNj04OD05Nj1FNT04OD04Nz1FNj04RD1BMj1FNT04RT04Nj1FNT04Rj1CMj0K
PUU4PUFFPUIwPUU1PUJEPTk1IiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtv
OjE1CisvLyBweXRob24tZm9ybWF0CisiIGN1cnJlbnQgaGlzdG9yeSAoc3RvcmVkIGFzIFwiJXNc
IikiIDoKKyIgPUU1PUJEPTkzPUU1PTg5PThEPUU1PThFPTg2PUU1PThGPUIyPUVGPUJDPTg4PUU0
PUJCPUE1XCIlc1wiPUU1PUJEPUEyPUU1PQo9QkM9OEY9RTU9QUQ9OTg9RTU9ODI9QTg9RUY9QkM9
ODkiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MTYKKyJMaXN0IiA6Cisi
PUU1PTg4PTk3PUU4PUExPUE4IiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtv
OjE2CisiIHByZXZpb3VzbHkgc3RvcmVkIGhpc3RvcmllcyIgOgorIiA9RTQ9QkI9QTU9RTU9ODk9
OEQ9RTU9QUQ9OTg9RTU9ODI9QTg9RTc9OUE9ODQ9RTU9OEU9ODY9RTU9OEY9QjI9RTg9QUU9QjA9
Cj1FNT1CRD05NSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzoxOAorIkNy
ZWF0ZSIgOgorIj1FNT04OD05Qj1FNT1CQj1CQSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29w
dGlvbnMubWFrbzoxOAorIiBhIG5ldyBlbXB0eSBoaXN0b3J5IiA6CisiID1FND1COD04MD1FND1C
OD1BQT1FNj05Nj1CMD1FNz05QT04ND1FNz1BOT1CQT1FNz05OT1CRD1FNT04RT04Nj1FNT04Rj1C
Mj0KPUU4PUFFPUIwPUU1PUJEPTk1IiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5t
YWtvOjIwCisiQ29uc3RydWN0IHdvcmtmbG93IiA6CisiPUU2PTlFPTg0PUU1PUJCPUJBPUU1PUI3
PUE1PUU0PUJEPTlDPUU2PUI1PTgxPUU3PUE4PThCIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkv
b3B0aW9ucy5tYWtvOjIwCisiIGZyb20gdGhlIGN1cnJlbnQgaGlzdG9yeSIgOgorIiA9RTY9OUQ9
QTU9RTY9QkE9OTA9RTQ9QkE9OEU9RTU9QkQ9OTM9RTU9ODk9OEQ9RTU9OEU9ODY9RTU9OEY9QjIi
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjEgdGVtcGxhdGVzL2hpc3Rv
cnkvb3B0aW9ucy5tYWtvOjI0CisiIGN1cnJlbnQgaGlzdG9yeSIgOgorIiA9RTU9QkQ9OTM9RTU9
ODk9OEQ9RTU9OEU9ODY9RTU9OEY9QjIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25z
Lm1ha286MjMKKyJTaG93IGRlbGV0ZWQiIDoKKyI9RTY9OTg9QkU9RTc9QTQ9QkE9RTU9Qjc9QjI9
RTU9ODg9QTA9RTk9OTk9QTQiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286
MjMKKyIgZGF0YXNldHMgaW4gaGlzdG9yeSIgOgorIiA9RTU9OEU9ODY9RTU9OEY9QjI9RTQ9Qjg9
QUQ9RTc9OUE9ODQ9RTY9OTU9QjA9RTY9OEQ9QUU9RTk9OUI9ODYiLAorCisvLyB0ZW1wbGF0ZXMv
aGlzdG9yeS9yZW5hbWUubWFrbzozIHRlbXBsYXRlcy9oaXN0b3J5L3JlbmFtZS5tYWtvOjYKKyJS
ZW5hbWUgSGlzdG9yeSIgOgorIj1FOT04Nz04RD1FNT05MT1CRD1FNT05MD04RD1FNT04RT04Nj1F
NT04Rj1CMiIsCisKKworIlJlbmFtZSBIaXN0b3JpZXMiIDoKKyI9RTk9ODc9OEQ9RTU9OTE9QkQ9
RTU9OTA9OEQ9RTU9OEU9ODY9RTU9OEY9QjI9RTg9QUU9QjA9RTU9QkQ9OTUiLAorCisiUGVyZm9y
bSBBY3Rpb24iIDoKKyI9RTg9QkY9OTA9RTg9QTE9OEM9RTY9OTM9OEQ9RTQ9QkQ9OUMiLAorCisi
U3VibWl0IiA6CisiPUU2PThGPTkwPUU0PUJBPUE0IiwKKworCisKKy8vIHRlbXBsYXRlcy9oaXN0
b3J5L3JlbmFtZS5tYWtvOjEwCisiQ3VycmVudCBOYW1lIiA6CisiPUU1PUJEPTkzPUU1PTg5PThE
PUU1PTkwPThEPUU3PUE3PUIwIiwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvcmVuYW1lLm1ha286
MTAKKyJOZXcgTmFtZSIgOgorIj1FNj05Nj1CMD1FNT05MD04RD1FNz1BNz1CMCIsCisKKy8vIHRl
bXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286MworIlNoYXJlIGhpc3RvcmllcyIgOgorIj1FNT04
NT1CMT1FND1CQT1BQj1FNT04RT04Nj1FNT04Rj1CMj1FOD1BRT1CMD1FNT1CRD05NSIsCisKKy8v
IHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286NgorIlNoYXJlIEhpc3RvcmllcyIgOgorIj1F
NT04NT1CMT1FND1CQT1BQj1FNT04RT04Nj1FNT04Rj1CMj1FOD1BRT1CMD1FNT1CRD05NSIsCisK
Ky8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286OQorIkhpc3RvcnkgTmFtZToiIDoKKyI9
RTU9OEU9ODY9RTU9OEY9QjI9RTU9OTA9OEQ9RTc9QTc9QjAiLAorCisvLyB0ZW1wbGF0ZXMvaGlz
dG9yeS9zaGFyZS5tYWtvOjkKKyJOdW1iZXIgb2YgRGF0YXNldHM6IiA6CisiPUU2PTk1PUIwPUU2
PThEPUFFPUU5PTlCPTg2PUU2PTk1PUIwPUU5PTg3PThGIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rv
cnkvc2hhcmUubWFrbzo5CisiU2hhcmUgTGluayIgOgorIj1FNT04NT1CMT1FND1CQT1BQj1FOT05
Mz1CRT1FNj04RT1BNSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286MTUKKyJU
aGlzIGhpc3RvcnkgY29udGFpbnMgbm8gZGF0YS4iIDoKKyI9RTg9QkY9OTk9RTk9QTE9Qjk9RTU9
OEU9ODY9RTU9OEY9QjI9RTQ9Qjg9QUQ9RTY9QjI9QTE9RTY9OUM9ODk9RTY9OTU9QjA9Cj1FNj04
RD1BRSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286MjEKKyJjb3B5IGxpbmsg
dG8gc2hhcmUiIDoKKyI9RTU9QTQ9OEQ9RTU9ODg9QjY9RTk9OTM9QkU9RTY9OEU9QTU9RTQ9QkI9
QTU9RTU9ODU9QjE9RTQ9QkE9QUIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtv
OjI0CisiRW1haWwgb2YgVXNlciB0byBzaGFyZSB3aXRoOiIgOgorIj1FNT04Rj05MT1FOT04MD04
MT1FNT04OD1CMD1FOD1CRj05OT1FND1CQT05QkVtYWlsPUU1PTlDPUIwPUU1PTlEPTgwPUU4PQo9
QkY9OUI9RTg9QTE9OEM9RTU9ODg9ODY9RTQ9QkE9QUIiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9o
aXN0b3J5Lm1ha286NworIkdhbGF4eSBIaXN0b3J5IiA6CisiR2FsYXh5ID1FNT04RT04Nj1FNT04
Rj1CMiIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnkubWFrbzoyMzcKKyJyZWZyZXNoIiA6
CisiPUU1PTg4PUI3PUU2PTk2PUIwIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeS5tYWtv
OjI0NQorIllvdSBhcmUgY3VycmVudGx5IHZpZXdpbmcgYSBkZWxldGVkIGhpc3RvcnkhIiA6Cisi
PUU2PUFEPUEzPUU1PTlDPUE4PUU2PTlGPUE1PUU3PTlDPThCPUU1PUI3PUIyPUU1PTg4PUEwPUU5
PTk5PUE0PUU3PTlBPTg0PQo9RTU9OEU9ODY9RTU9OEY9QjIiLAorCisvLyB0ZW1wbGF0ZXMvcm9v
dC9oaXN0b3J5Lm1ha286Mjg5CisiWW91ciBoaXN0b3J5IGlzIGVtcHR5LiBDbGljayAnR2V0IERh
dGEnIG9uIHRoZSBsZWZ0IHBhbmUgdG8gc3RhcnQiIDoKKyI9RTU9OEU9ODY9RTU9OEY9QjI9RTU9
Qjc9QjI9RTc9QTk9QkE9RUY9QkM9OEM9RTg9QUY9Qjc9RTU9OEQ9OTU9RTU9ODc9QkI9Cj1FNT1C
Nz1BNj1FOD1CRT1COT1FNz1BQT05Nz1FNj1BMD1CQz1FND1COD1BRD1FMj04MD05OD1FOD04RT1C
Nz1FNT04Rj05Nj1FNj0KPTk1PUIwPUU2PThEPUFFPUUyPTgwPTk5IiwKKworLy8gdGVtcGxhdGVz
L3Jvb3QvaGlzdG9yeV9jb21tb24ubWFrbzo0MQorIkpvYiBpcyB3YWl0aW5nIHRvIHJ1biIgOgor
Ij1FNz1BRD04OT1FNT1CRT04NT1FOD1CRj05MD1FOD1BMT04Qz1FNz05QT04ND1FOD1CRj05Qj1F
Nz1BOD04QiIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NDMKKyJK
b2IgaXMgY3VycmVudGx5IHJ1bm5pbmciIDoKKyI9RTY9QUQ9QTM9RTU9OUM9QTg9RTg9QkY9OTA9
RTg9QTE9OEM9RTc9OUE9ODQ9RTg9QkY9OUI9RTc9QTg9OEIiLAorCisvLyB0ZW1wbGF0ZXMvcm9v
dC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQ2CisiQW4gZXJyb3Igb2NjdXJyZWQgcnVubmluZyB0aGlz
IGpvYjogIiA6CisiPUU4PUJGPTlCPUU3PUE4PThCPUU4PUJGPTkwPUU4PUExPThDPUU2PTk3PUI2
PUU1PTg3PUJBPUU5PTk0PTk5ICIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9u
Lm1ha286NDcKKyJyZXBvcnQgdGhpcyBlcnJvciIgOgorIj1FNj04QT1BNT1FNT05MT04QT1FOT05
ND05OT1FOD1BRj1BRiIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286
NTQKKyJObyBkYXRhOiAiIDoKKyI9RTY9QjI9QTE9RTY9OUM9ODk9RTY9OTU9QjA9RTY9OEQ9QUU9
RUY9QkM9OUEgIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeV9jb21tb24ubWFrbzo1OAor
ImZvcm1hdDogIiA6CisiPUU2PUEwPUJDPUU1PUJDPThGPUVGPUJDPTlBICIsCisKKy8vIHRlbXBs
YXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NTkKKyJkYXRhYmFzZTogIiA6CisiPUU2PTk1
PUIwPUU2PThEPUFFPUU1PUJBPTkzPUVGPUJDPTlBICIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hp
c3RvcnlfY29tbW9uLm1ha286NjYgdGVtcGxhdGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMAorIklu
Zm86ICIgOgorIj1FND1CRj1BMT1FNj04MT1BRj1FRj1CQz05QSAiLAorCisvLyB0ZW1wbGF0ZXMv
cm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjg1CisvLyBweXRob24tZm9ybWF0CisiRXJyb3I6IHVu
a25vd24gZGF0YXNldCBzdGF0ZSBcIiVzXCIuIiA6CisiPUU5PTk0PTk5PUU4PUFGPUFGPUVGPUJD
PTlBPUU2PTlDPUFBPUU3PTlGPUE1PUU3PTlBPTg0PUU2PTk1PUIwPUU2PThEPUFFPQo9RTk9OUI9
ODY9RTc9OEE9QjY9RTY9ODA9ODEgXCIlc1wiPUUzPTgwPTgyIiwKKworCisiT3B0aW9ucyIgOgor
Ij1FOT04MD04OT1FOT1BMT1COSIsCisKKyJIaXN0b3J5IiA6CisiPUU1PThFPTg2PUU1PThGPUIy
IiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMAorInJlcG9ydCBidWdzIiA6
CisiPUU5PTk0PTk5PUU4PUFGPUFGPUU2PThBPUE1PUU1PTkxPThBIiwKKworLy8gdGVtcGxhdGVz
L3Jvb3QvbWFzdGhlYWQubWFrbzoyMQorIndpa2kiIDoKKyJ3aWtpIiwKKworLy8gdGVtcGxhdGVz
L3Jvb3QvbWFzdGhlYWQubWFrbzoyMgorInNjcmVlbmNhc3RzIiA6CisiPUU2PUJDPTk0PUU3PUE0
PUJBPUU4PUE3PTg2PUU5PUEyPTkxIiwKKworCisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5t
YWtvOjIzCisiYmxvZyIgOgorIj1FNT04RD05QT1FNT1BRT1BMiIsCisKKy8vIHRlbXBsYXRlcy9y
b290L21hc3RoZWFkLm1ha286MzEKKy8vIHB5dGhvbi1mb3JtYXQKKyJMb2dnZWQgaW4gYXMgJXM6
ICIgOgorIj1FND1CQj1BNSVzPUU3PTlBPTg0PUU4PUJBPUFCPUU0PUJCPUJEPUU3PTk5PUJCPUU1
PUJEPTk1OiAiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjMxCisibWFuYWdl
IiA6CisiPUU3PUFFPUExPUU3PTkwPTg2IiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvbWFzdGhlYWQu
bWFrbzozMgorImxvZ291dCIgOgorIj1FNj1CMz1BOD1FOT05ND04MCIsCisKKy8vIHRlbXBsYXRl
cy9yb290L21hc3RoZWFkLm1ha286MzQKKyJBY2NvdW50OiAiIDoKKyI9RTU9Qjg9OTA9RTY9ODg9
Qjc6ICIsCisKKy8vIHRlbXBsYXRlcy9yb290L21hc3RoZWFkLm1ha286MzQKKyJjcmVhdGUiIDoK
KyI9RTU9ODg9OUI9RTU9QkI9QkEiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtv
OjM1CisibG9naW4iIDoKKyI9RTc9OTk9QkI9RTU9QkQ9OTUiLAorCisvLyB0ZW1wbGF0ZXMvcm9v
dC90b29sX21lbnUubWFrbzo1MgorIkdhbGF4eSBUb29scyIgOgorIkdhbGF4eSA9RTU9Qjc9QTU9
RTU9ODU9QjciLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC90b29sX21lbnUubWFrbzoxMjkKKyJXb3Jr
ZmxvdyIgOgorIj1FNT1CNz1BNT1FND1CRD05Qz1FNj1CNT04MT1FNz1BOD04QiIsCisKKy8vIHRl
bXBsYXRlcy9yb290L3Rvb2xfbWVudS5tYWtvOjEzNAorIk1hbmFnZSIgOgorIj1FNz1BRT1BMT1F
Nz05MD04NiIsCisKKy8vIHRlbXBsYXRlcy9yb290L3Rvb2xfbWVudS5tYWtvOjEzNAorIndvcmtm
bG93cyIgOgorIj1FNT1CNz1BNT1FND1CRD05Qz1FNj1CNT04MT1FNz1BOD04QiIsCisKKy8vIHRl
bXBsYXRlcy91c2VyL2luZGV4Lm1ha286MiB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjQKKyJB
Y2NvdW50IHNldHRpbmdzIiA6CisiPUU1PUI4PTkwPUU2PTg4PUI3PUU4PUFFPUJFPUU3PUJEPUFF
IiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzo3CisvLyBweXRob24tZm9ybWF0Cisi
WW91IGFyZSBjdXJyZW50bHkgbG9nZ2VkIGluIGFzICVzLiIgOgorIj1FNT1CRD05Mz1FNT04OT04
RD1FND1CQj1BNSVzPUU3PTlBPTg0PUU4PUJBPUFCPUU0PUJCPUJEPUU3PTk5PUJCPUU1PUJEPQo9
OTUiLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjkKKyJDaGFuZ2UgeW91ciBwYXNz
d29yZCIgOgorIj1FND1CRj1BRT1FNj05ND1COT1FNT1BRj04Nj1FNz1BMD04MSIsCisKKy8vIHRl
bXBsYXRlcy91c2VyL2luZGV4Lm1ha286MTAKKyJVcGRhdGUgeW91ciBlbWFpbCBhZGRyZXNzIiA6
CisiPUU2PTlCPUI0PUU2PTk2PUIwPUU3PTk0PUI1PUU1PUFEPTkwPUU5PTgyPUFFPUU0PUJCPUI2
PUU1PTlDPUIwPUU1PTlEPTgwIiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzoxMQor
IkxvZ291dCIgOgorIj1FNj1CMz1BOD1FOT05ND04MCIsCisKKy8vIHRlbXBsYXRlcy91c2VyL2lu
ZGV4Lm1ha286MTYKKyJMb2dpbiIgOgorIj1FNz05OT1CQj1FNT1CRD05NSIsCisKKy8vIHRlbXBs
YXRlcy91c2VyL2luZGV4Lm1ha286MTcKKyJDcmVhdGUgbmV3IGFjY291bnQiIDoKKyI9RTU9ODg9
OUI9RTU9QkI9QkE9RTY9OTY9QjA9RTU9Qjg9OTA9RTY9ODg9QjciLAorCisiU2hvdyBUb29sIFNl
YXJjaCIgOgorIj1FNj05OD1CRT1FNz1BND1CQT1FNT1CNz1BNT1FNT04NT1CNz1FNj05MD05Qz1F
Nz1CND1BMiIsCisKKyJBbmFseXplIERhdGEiIDoKKyI9RTU9ODg9ODY9RTY9OUU9OTA9RTY9OTU9
QjA9RTY9OEQ9QUUiLAorCisiYW5hbHlzaXMiIDoKKyI9RTU9ODg9ODY9RTY9OUU9OTAiLAorCisi
SGlzdG9yeSBMaXN0cyIgOgorIj1FNT04RT04Nj1FNT04Rj1CMj1FOD1BRT1CMD1FNT1CRD05NT1F
Nj1COD04NT1FNT04RD05NSIsCisKKyJIaXN0b3JpZXMgU2hhcmVkIHdpdGggTWUiIDoKKyI9RTU9
ODU9QjE9RTQ9QkE9QUI9RTc9OUE9ODQ9RTY9OTU9QjA9RTY9OEQ9QUUiLAorCisiQ3VycmVudCBI
aXN0b3J5IiA6CisiPUU1PUJEPTkzPUU1PTg5PThEPUU1PThFPTg2PUU1PThGPUIyPUU4PUFFPUIw
PUU1PUJEPTk1IiwKKworIkNyZWF0ZSBOZXciIDoKKyI9RTU9ODg9OUI9RTU9QkI9QkEiLAorCisi
Q2xvbmUiIDoKKyI9RTU9QTQ9OEQ9RTU9ODg9QjYiLAorCisiU2hhcmUgb3IgUHVibGlzaCIgOgor
Ij1FNT04NT1CMT1FND1CQT1BQj1FNj04OD05Nj1FNT04Rj05MT1FNT1COD04MyIsCisKKyJFeHRy
YWN0IFdvcmtmbG93IiA6CisiPUU2PThGPTkwPUU1PThGPTk2PUU1PUI3PUE1PUU0PUJEPTlDPUU2
PUI1PTgxPUU3PUE4PThCIiwKKworIkRhdGFzZXQgU2VjdXJpdHkiIDoKKyI9RTY9OTU9QjA9RTY9
OEQ9QUU9RTU9QUU9ODk9RTU9ODU9QTg9RTY9ODA9QTciLAorCisKKyJTaG93IERlbGV0ZWQgRGF0
YXNldHMiIDoKKyI9RTY9OTg9QkU9RTc9QTQ9QkE9RTU9Qjc9QjI9RTU9ODg9QTA9RTk9OTk9QTQ9
RTc9OUE9ODQ9RTY9OTU9QjA9RTY9OEQ9QUUiLAorCisiU2hvdyBIaWRkZW4gRGF0YXNldHMiIDoK
KyI9RTY9OTg9QkU9RTc9QTQ9QkE9RTk9OUE9OTA9RTg9OTc9OEY9RTc9OUE9ODQ9RTY9OTU9QjA9
RTY9OEQ9QUUiLAorCisiU2hvdyBTdHJ1Y3R1cmUiIDoKKyI9RTY9OTg9QkU9RTc9QTQ9QkE9RTc9
QkI9OTM9RTY9OUU9ODQiLAorCisiRXhwb3J0IHRvIEZpbGUiIDoKKyI9RTU9QUY9QkM9RTU9ODc9
QkE9RTQ9Qjg9QkE9RTY9OTY9ODc9RTQ9QkI9QjYiLAorCisiT3RoZXIgQWN0aW9ucyIgOgorIj1F
NT04NT1CNj1FND1CQj05NiIsCisKKyJJbXBvcnQgZnJvbSBGaWxlIiA6CisiPUU1PUFGPUJDPUU1
PTg1PUE1PUU2PTk2PTg3PUU0PUJCPUI2IiwKKworIlNoYXJlZCBEYXRhIiA6CisiPUU2PTk1PUIw
PUU2PThEPUFFPUU1PTg1PUIxPUU0PUJBPUFCIiwKKworIkRhdGEgTGlicmFyaWVzIiA6CisiPUU2
PTk1PUIwPUU2PThEPUFFPUU0PUJCPTkzPUU1PUJBPTkzIiwKKworIlB1Ymxpc2hlZCBIaXN0b3Jp
ZXMiIDoKKyI9RTU9Qjc9QjI9RTU9OEY9OTE9RTU9Qjg9ODM9RTc9OUE9ODQ9RTU9OEU9ODY9RTU9
OEY9QjI9RTg9QUU9QjA9RTU9QkQ9OTUiLAorCisiUHVibGlzaGVkIFdvcmtmbG93cyIgOgorIj1F
NT1CNz1CMj1FNT04Rj05MT1FNT1COD04Mz1FNz05QT04ND1FNT1CNz1BNT1FND1CRD05Qz1FNj1C
NT04MT1FNz1BOD04QiIsCisKKyJQdWJsaXNoZWQgUGFnZXMiIDoKKyI9RTU9Qjc9QjI9RTU9OEY9
OTE9RTU9Qjg9ODM9RTc9OUE9ODQ9RTk9QTE9QjU9RTk9OUQ9QTIiLAorCisiSGVscCIgOgorIj1F
NT1COD1BRT1FNT04QT1BOSIsCisKKyJFbWFpbCBjb21tZW50cywgYnVnIHJlcG9ydHMsIG9yIHN1
Z2dlc3Rpb25zIiA6CisiPUU1PThGPTkxPUU5PTgyPUFFPUU0PUJCPUI2PUU4PUJGPTlCPUU4PUEx
PThDPUU2PTg0PThGPUU4PUE3PTgxPUU1PThGPThEPQo9RTk9QTY9ODg9RTY9ODg9OTY9RTk9OTQ9
OTk9RTg9QUY9QUY9RTY9OEE9QTU9RTU9OTE9OEEiLAorCisKKyJVc2VyIiA6CisiPUU3PTk0PUE4
PUU2PTg4PUI3IiwKKworCisiUmVnaXN0ZXIiIDoKKyI9RTY9QjM9QTg9RTU9ODY9OEMiLAorCisi
U3VwcG9ydCIgOgorIj1FNj04QT04MD1FNj05Qz1BRj1FNj05ND1BRj1FNj04Qz04MSIsCisKKyJH
YWxheHkgV2lraSIgOgorIkdhbGF4eT1FNz05OT1CRT1FNz1BNz05MSIsCisKKyJWaWRlbyB0dXRv
cmlhbHMgKHNjcmVlbmNhc3RzKSIgOgorIj1FOD1BNz04Nj1FOT1BMj05MT1FNj05NT05OT1FNz1B
OD04Qj1FRj1CQz04OD1FNT04QT1BOD1FNz05ND1CQj1FNj1CQz05ND0KPUU3PUE0PUJBPUVGPUJD
PTg5IiwKKworIkhvdyB0byBDaXRlIEdhbGF4eSIgOgorIj1FNT1BNj04Mj1FND1CRD05NT1FNT1C
Qz05NT1FNz05ND1BOEdhbGF4eSIsCit9KQoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYx
ZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRjYzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRk
ZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9wYWNrZWQvZ2FsYXh5LWFwcC1iYXNlLmpzCi0tLSBhL3N0
YXRpYy9zY3JpcHRzL3BhY2tlZC9nYWxheHktYXBwLWJhc2UuanMKKysrIGIvc3RhdGljL3Njcmlw
dHMvcGFja2VkL2dhbGF4eS1hcHAtYmFzZS5qcwpAQCAtMSwxICsxLDEgQEAKLWRlZmluZShbIm12
Yy91c2VyL3VzZXItbW9kZWwiLCJ1dGlscy9tZXRyaWNzLWxvZ2dlciIsInV0aWxzL2FkZC1sb2dn
aW5nIl0sPQpmdW5jdGlvbihhLGMsZSl7ZnVuY3Rpb24gZihrKXt2YXIgaj0zRHRoaXM7cmV0dXJu
IGouX2luaXQoa3x8e30pfWUoZiwiR2FsYXg9CnlBcHAiKTtmLmRlZmF1bHRPcHRpb25zPTNEe3Jv
b3Q6Ii8ifTtmLnByb3RvdHlwZS5faW5pdD0zRGZ1bmN0aW9uIGgoayl7dmFyID0Kaj0zRHRoaXM7
ai5faW5pdExvZ2dlcihrLmxvZ2dlck9wdGlvbnN8fHt9KTtqLmRlYnVnKCJHYWxheHlBcHAubG9n
Z2VyOiAiLGouPQpsb2dnZXIpO2ouX3Byb2Nlc3NPcHRpb25zKGspO2ouZGVidWcoIkdhbGF4eUFw
cC5vcHRpb25zOiAiLGoub3B0aW9ucyk7ai5jb249CmZpZz0zRGsuY29uZmlnfHx7fTtqLmRlYnVn
KCJHYWxheHlBcHAuY29uZmlnOiAiLGouY29uZmlnKTtqLl9pbml0VXNlcihrLnVzZT0KckpTT058
fHt9KTtqLmRlYnVnKCJHYWxheHlBcHAudXNlcjogIixqLnVzZXIpO3JldHVybiBqfTtmLnByb3Rv
dHlwZS5fcHJvY2VzPQpzT3B0aW9ucz0zRGZ1bmN0aW9uIGQobSl7dmFyIGw9M0R0aGlzLG49M0Rm
LmRlZmF1bHRPcHRpb25zO2wuZGVidWcoIl9wcm9jZXM9CnNPcHRpb25zOiAiLG0pO2wub3B0aW9u
cz0zRHt9O2Zvcih2YXIgaiBpbiBuKXtpZihuLmhhc093blByb3BlcnR5KGopKXtsLm9wdD0KaW9u
c1tqXT0zRChtLmhhc093blByb3BlcnR5KGopKT8obVtqXSk6KG5bal0pfX1yZXR1cm4gbH07Zi5w
cm90b3R5cGUuX2luaXRVPQpzZXI9M0RmdW5jdGlvbiBnKGspe3ZhciBqPTNEdGhpcztqLmRlYnVn
KCJfaW5pdFVzZXI6IixrKTtqLnVzZXI9M0RuZXcgYS5Vc2U9CnIoayk7cmV0dXJuIGp9O2YucHJv
dG90eXBlLl9pbml0TG9nZ2VyPTNEZnVuY3Rpb24gaShrKXt2YXIgaj0zRHRoaXM7ai5kZWJ1Zz0K
KCJfaW5pdExvZ2dlcjoiLGspO2oubG9nZ2VyPTNEbmV3IGMuTWV0cmljc0xvZ2dlcihrKTtyZXR1
cm4gan07Zi5wcm90b3R5cGUuPQp0b1N0cmluZz0zRGZ1bmN0aW9uIGIoKXt2YXIgaj0zRHRoaXMu
dXNlci5nZXQoImVtYWlsIil8fCIoYW5vbnltb3VzKSI7cmV0dXI9Cm4iR2FsYXh5QXBwKCIraisi
KSJ9O3JldHVybntHYWxheHlBcHA6Zn19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitk
ZWZpbmUoWyJtdmMvdXNlci91c2VyLW1vZGVsIiwidXRpbHMvbWV0cmljcy1sb2dnZXIiLCJ1dGls
cy9hZGQtbG9nZ2luZyIsIj0KdXRpbHMvbG9jYWxpemF0aW9uIl0sZnVuY3Rpb24oYSxjLGYsZCl7
ZnVuY3Rpb24gZyhtKXt2YXIgbD0zRHRoaXM7cmV0dXJuIGwuPQpfaW5pdChtfHx7fSl9ZihnLCJH
YWxheHlBcHAiKTtnLmRlZmF1bHRPcHRpb25zPTNEe3Jvb3Q6Ii8ifTtnLnByb3RvdHlwZS5faW49
Cml0PTNEZnVuY3Rpb24gaihtKXt2YXIgbD0zRHRoaXM7bC5fcHJvY2Vzc09wdGlvbnMobSk7bC5k
ZWJ1ZygiR2FsYXh5QXBwLm9wdD0KaW9uczogIixsLm9wdGlvbnMpO2wuX2luaXRMb2dnZXIobS5s
b2dnZXJPcHRpb25zfHx7fSk7bC5kZWJ1ZygiR2FsYXh5QXBwLmxvPQpnZ2VyOiAiLGwubG9nZ2Vy
KTtsLl9pbml0TG9jYWxlKCk7bC5kZWJ1ZygiR2FsYXh5QXBwLmxvY2FsaXplOiAiLGwubG9jYWxp
emU9Cik7bC5jb25maWc9M0RtLmNvbmZpZ3x8e307bC5kZWJ1ZygiR2FsYXh5QXBwLmNvbmZpZzog
IixsLmNvbmZpZyk7bC5faW5pdFVzZT0KcihtLnVzZXJKU09OfHx7fSk7bC5kZWJ1ZygiR2FsYXh5
QXBwLnVzZXI6ICIsbC51c2VyKTtyZXR1cm4gbH07Zy5wcm90b3R5cGUuPQpfcHJvY2Vzc09wdGlv
bnM9M0RmdW5jdGlvbiBlKG4pe3ZhciBtPTNEdGhpcyxvPTNEZy5kZWZhdWx0T3B0aW9uczttLmRl
YnVnKCI9Cl9wcm9jZXNzT3B0aW9uczogIixuKTttLm9wdGlvbnM9M0R7fTtmb3IodmFyIGwgaW4g
byl7aWYoby5oYXNPd25Qcm9wZXJ0eShsKT0KKXttLm9wdGlvbnNbbF09M0Qobi5oYXNPd25Qcm9w
ZXJ0eShsKSk/KG5bbF0pOihvW2xdKX19cmV0dXJuIG19O2cucHJvdG90eXBlPQouX2luaXRVc2Vy
PTNEZnVuY3Rpb24gaShtKXt2YXIgbD0zRHRoaXM7bC5kZWJ1ZygiX2luaXRVc2VyOiIsbSk7bC51
c2VyPTNEbmU9CncgYS5Vc2VyKG0pO3JldHVybiBsfTtnLnByb3RvdHlwZS5faW5pdExvZ2dlcj0z
RGZ1bmN0aW9uIGsobSl7dmFyIGw9M0R0aGlzOz0KbC5kZWJ1ZygiX2luaXRMb2dnZXI6IixtKTts
LmxvZ2dlcj0zRG5ldyBjLk1ldHJpY3NMb2dnZXIobSk7cmV0dXJuIGx9O2cucHJvPQp0b3R5cGUu
X2luaXRMb2NhbGU9M0RmdW5jdGlvbiBoKG0pe3ZhciBsPTNEdGhpcztsLmRlYnVnKCJfaW5pdExv
Y2FsZToiLG0pO2w9Ci5sb2NhbGl6ZT0zRGQ7d2luZG93Ll9sPTNEbC5sb2NhbGl6ZTtyZXR1cm4g
bH07Zy5wcm90b3R5cGUudG9TdHJpbmc9M0RmdW5jdD0KaW9uIGIoKXt2YXIgbD0zRHRoaXMudXNl
ci5nZXQoImVtYWlsIil8fCIoYW5vbnltb3VzKSI7cmV0dXJuIkdhbGF4eUFwcCgiK2wrPQoiKSJ9
O3JldHVybntHYWxheHlBcHA6Z319KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpkaWZm
IC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0
N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9p
MThuLmpzCi0tLSAvZGV2L251bGwKKysrIGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL2kxOG4uanMK
QEAgLTAsMCArMSwxIEBACisoZnVuY3Rpb24oKXt2YXIgYT0zRC8oXi4qKF58XC8pbmxzKFwvfCQp
KShbXlwvXSopXC8/KFteXC9dKikvO2Z1bmN0aW9uIGQoZT0KLGgsZyxmLGksail7aWYoaFtlXSl7
Zy5wdXNoKGUpO2lmKGhbZV09M0Q9M0Q9M0R0cnVlfHxoW2VdPTNEPTNEPTNEMSl7Zi5wdXNoPQoo
aStlKyIvIitqKX19fWZ1bmN0aW9uIGMoZyxlLGYsaCxpKXt2YXIgaj0zRGgrZSsiLyIraTtpZihy
ZXF1aXJlLl9maWxlRXhpc3Q9CnMoZy50b1VybChqKyIuanMiKSkpe2YucHVzaChqKX19ZnVuY3Rp
b24gYihnLGYsZSl7dmFyIGg7Zm9yKGggaW4gZil7aWYoZi5oYT0Kc093blByb3BlcnR5KGgpJiYo
IWcuaGFzT3duUHJvcGVydHkoaCl8fGUpKXtnW2hdPTNEZltoXX1lbHNle2lmKHR5cGVvZiBmW2hd
PQo9M0Q9M0Q9M0Qib2JqZWN0Iil7aWYoIWdbaF0mJmZbaF0pe2dbaF09M0R7fX1iKGdbaF0sZlto
XSxlKX19fX1kZWZpbmUoWyJtb2Q9CnVsZSJdLGZ1bmN0aW9uKGUpe3ZhciBmPTNEZS5jb25maWc/
ZS5jb25maWcoKTp7fTtyZXR1cm57dmVyc2lvbjoiMi4wLjQiLGxvYT0KZDpmdW5jdGlvbihnLHMs
cixrKXtrPTNEa3x8e307aWYoay5sb2NhbGUpe2YubG9jYWxlPTNEay5sb2NhbGV9dmFyIHEsbj0z
RGEuPQpleGVjKGcpLG89M0RuWzFdLHQ9M0RuWzRdLHY9M0RuWzVdLGw9M0R0LnNwbGl0KCItIiks
aD0zRFtdLHU9M0R7fSxtLGoscD0zRCI9CiI7aWYobls1XSl7bz0zRG5bMV07cT0zRG8rdn1lbHNl
e3E9M0RnO3Y9M0RuWzRdO3Q9M0RmLmxvY2FsZTtpZighdCl7dD0zRGYubD0Kb2NhbGU9M0R0eXBl
b2YgbmF2aWdhdG9yPTNEPTNEPTNEInVuZGVmaW5lZCI/InJvb3QiOihuYXZpZ2F0b3IubGFuZ3Vh
Z2V8fG5hPQp2aWdhdG9yLnVzZXJMYW5ndWFnZXx8InJvb3QiKS50b0xvd2VyQ2FzZSgpfWw9M0R0
LnNwbGl0KCItIil9aWYoay5pc0J1aWxkKXs9CmgucHVzaChxKTtjKHMsInJvb3QiLGgsbyx2KTtm
b3IobT0zRDA7bTxsLmxlbmd0aDttKyspe2o9M0RsW21dO3ArPTNEKHA/Ii0iOj0KIiIpK2o7Yyhz
LHAsaCxvLHYpfXMoaCxmdW5jdGlvbigpe3IoKX0pfWVsc2V7cyhbcV0sZnVuY3Rpb24oeCl7dmFy
IHc9M0RbXSxpPQo7ZCgicm9vdCIseCx3LGgsbyx2KTtmb3IobT0zRDA7bTxsLmxlbmd0aDttKysp
e2k9M0RsW21dO3ArPTNEKHA/Ii0iOiIiKStpO2Q9CihwLHgsdyxoLG8sdil9cyhoLGZ1bmN0aW9u
KCl7dmFyIEEseSx6O2ZvcihBPTNEdy5sZW5ndGgtMTtBPi0xJiZ3W0FdO0EtLSl7ej0KPTNEd1tB
XTt5PTNEeFt6XTtpZih5PTNEPTNEPTNEdHJ1ZXx8eT0zRD0zRD0zRDEpe3k9M0RzKG8reisiLyIr
dil9Yih1LHkpfXIoPQp1KX0pfSl9fX19KX0oKSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls
ZQoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRj
YzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9w
YWNrZWQvbXZjL2RhdGFzZXQvaGRhLWJhc2UuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2Vk
L212Yy9kYXRhc2V0L2hkYS1iYXNlLmpzCisrKyBiL3N0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMv
ZGF0YXNldC9oZGEtYmFzZS5qcwpAQCAtMSwxICsxLDEgQEAKLWRlZmluZShbIm12Yy9kYXRhc2V0
L2hkYS1tb2RlbCIsIm12Yy9iYXNlLW12YyJdLGZ1bmN0aW9uKGQsYil7dmFyIGM9M0RCYWNrPQpi
b25lLlZpZXcuZXh0ZW5kKGIuTG9nZ2FibGVNaXhpbikuZXh0ZW5kKHt0YWdOYW1lOiJkaXYiLGNs
YXNzTmFtZToiZGF0YXNldCA9CmhkYSBoaXN0b3J5LXBhbmVsLWhkYSIsaWQ6ZnVuY3Rpb24oKXty
ZXR1cm4iaGRhLSIrdGhpcy5tb2RlbC5nZXQoImlkIil9LGZ4Uz0KcGVlZDoiZmFzdCIsaW5pdGlh
bGl6ZTpmdW5jdGlvbihmKXtpZihmLmxvZ2dlcil7dGhpcy5sb2dnZXI9M0R0aGlzLm1vZGVsLmxv
PQpnZ2VyPTNEZi5sb2dnZXJ9dGhpcy5sb2codGhpcysiLmluaXRpYWxpemU6IixmKTt0aGlzLmRl
ZmF1bHRQcmltYXJ5QWN0aW9uQnU9CnR0b25SZW5kZXJlcnM9M0RbdGhpcy5fcmVuZGVyX3Nob3dQ
YXJhbXNCdXR0b25dO3RoaXMubGlua1RhcmdldD0zRGYubGlua1Rhcj0KZ2V0fHwiX2JsYW5rIjt0
aGlzLnNlbGVjdGFibGU9M0RmLnNlbGVjdGFibGV8fGZhbHNlO3RoaXMuc2VsZWN0ZWQ9M0RmLnNl
bGVjPQp0ZWR8fGZhbHNlO3RoaXMuZXhwYW5kZWQ9M0RmLmV4cGFuZGVkfHxmYWxzZTt0aGlzLmRy
YWdnYWJsZT0zRGYuZHJhZ2dhYmxlfHw9CmZhbHNlO3RoaXMuX3NldFVwTGlzdGVuZXJzKCl9LF9z
ZXRVcExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMubW9kZWwub24oImNoYT0KbmdlIixmdW5jdGlv
bihnLGYpe2lmKHRoaXMubW9kZWwuY2hhbmdlZEF0dHJpYnV0ZXMoKS5zdGF0ZSYmdGhpcy5tb2Rl
bC5pblJlPQphZHlTdGF0ZSgpJiZ0aGlzLmV4cGFuZGVkJiYhdGhpcy5tb2RlbC5oYXNEZXRhaWxz
KCkpe3RoaXMubW9kZWwuZmV0Y2goKX1lbHM9CmV7dGhpcy5yZW5kZXIoKX19LHRoaXMpfSxyZW5k
ZXI6ZnVuY3Rpb24oaCl7aD0zRChoPTNEPTNEPTNEdW5kZWZpbmVkKT8odHJ1ZT0KKTooaCk7dmFy
IGY9M0R0aGlzO3RoaXMuJGVsLmZpbmQoIlt0aXRsZV0iKS50b29sdGlwKCJkZXN0cm95Iik7dGhp
cy51cmxzPTNEPQp0aGlzLm1vZGVsLnVybHMoKTt2YXIgZz0zRHRoaXMuX2J1aWxkTmV3UmVuZGVy
KCk7aWYoaCl7JChmKS5xdWV1ZShmdW5jdGlvbig9Cmkpe3RoaXMuJGVsLmZhZGVPdXQoZi5meFNw
ZWVkLGkpfSl9JChmKS5xdWV1ZShmdW5jdGlvbihpKXt0aGlzLiRlbC5lbXB0eSgpLj0KYXR0cigi
Y2xhc3MiLGYuY2xhc3NOYW1lKS5hZGRDbGFzcygic3RhdGUtIitmLm1vZGVsLmdldCgic3RhdGUi
KSkuYXBwZW5kKGcuPQpjaGlsZHJlbigpKTtpZih0aGlzLnNlbGVjdGFibGUpe3RoaXMuc2hvd1Nl
bGVjdG9yKDApfWkoKX0pO2lmKGgpeyQoZikucXVldWU9CihmdW5jdGlvbihpKXt0aGlzLiRlbC5m
YWRlSW4oZi5meFNwZWVkLGkpfSl9JChmKS5xdWV1ZShmdW5jdGlvbihpKXt0aGlzLnRyaT0KZ2dl
cigicmVuZGVyZWQiLGYpO2lmKHRoaXMubW9kZWwuaW5SZWFkeVN0YXRlKCkpe3RoaXMudHJpZ2dl
cigicmVuZGVyZWQ6cmVhPQpkeSIsZil9aWYodGhpcy5kcmFnZ2FibGUpe3RoaXMuZHJhZ2dhYmxl
T24oKX1pKCl9KTtyZXR1cm4gdGhpc30sX2J1aWxkTmV3UmU9Cm5kZXI6ZnVuY3Rpb24oKXt2YXIg
Zj0zRCQoYy50ZW1wbGF0ZXMuc2tlbGV0b24odGhpcy5tb2RlbC50b0pTT04oKSkpO2YuZmluZD0K
KCIuZGF0YXNldC1wcmltYXJ5LWFjdGlvbnMiKS5hcHBlbmQodGhpcy5fcmVuZGVyX3RpdGxlQnV0
dG9ucygpKTtmLmNoaWxkcmVuPQooIi5kYXRhc2V0LWJvZHkiKS5yZXBsYWNlV2l0aCh0aGlzLl9y
ZW5kZXJfYm9keSgpKTt0aGlzLl9zZXRVcEJlaGF2aW9ycyhmKTs9CnJldHVybiBmfSxfc2V0VXBC
ZWhhdmlvcnM6ZnVuY3Rpb24oZil7Zj0zRGZ8fHRoaXMuJGVsO21ha2VfcG9wdXBfbWVudXMoZik7
Zj0KLmZpbmQoIlt0aXRsZV0iKS50b29sdGlwKHtwbGFjZW1lbnQ6ImJvdHRvbSJ9KX0sX3JlbmRl
cl90aXRsZUJ1dHRvbnM6ZnVuY3RpPQpvbigpe3JldHVyblt0aGlzLl9yZW5kZXJfZGlzcGxheUJ1
dHRvbigpXX0sX3JlbmRlcl9kaXNwbGF5QnV0dG9uOmZ1bmN0aW9uKCk9CntpZigodGhpcy5tb2Rl
bC5nZXQoInN0YXRlIik9M0Q9M0Q9M0RkLkhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb24uU1RBVEVT
Lk5PVD0KX1ZJRVdBQkxFKXx8KHRoaXMubW9kZWwuZ2V0KCJzdGF0ZSIpPTNEPTNEPTNEZC5IaXN0
b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUPQpBVEVTLkRJU0NBUkRFRCl8fCghdGhpcy5tb2RlbC5n
ZXQoImFjY2Vzc2libGUiKSkpe3JldHVybiBudWxsfXZhciBnPTNEe3Rhcmc9CmV0OnRoaXMubGlu
a1RhcmdldCxjbGFzc2VzOiJkYXRhc2V0LWRpc3BsYXkifTtpZih0aGlzLm1vZGVsLmdldCgicHVy
Z2VkIikpez0KZy5kaXNhYmxlZD0zRHRydWU7Zy50aXRsZT0zRF9sKCJDYW5ub3QgZGlzcGxheSBk
YXRhc2V0cyByZW1vdmVkIGZyb20gZGlzayIpPQp9ZWxzZXtpZih0aGlzLm1vZGVsLmdldCgic3Rh
dGUiKT0zRD0zRD0zRGQuSGlzdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5TVEFURVM9Ci5VUExPQUQp
e2cuZGlzYWJsZWQ9M0R0cnVlO2cudGl0bGU9M0RfbCgiVGhpcyBkYXRhc2V0IG11c3QgZmluaXNo
IHVwbG9hZGluZz0KIGJlZm9yZSBpdCBjYW4gYmUgdmlld2VkIil9ZWxzZXtpZih0aGlzLm1vZGVs
LmdldCgic3RhdGUiKT0zRD0zRD0zRGQuSGlzdG9yPQp5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRF
Uy5ORVcpe2cuZGlzYWJsZWQ9M0R0cnVlO2cudGl0bGU9M0RfbCgiVGhpcyBkYXRhc2U9CnQgaXMg
bm90IHlldCB2aWV3YWJsZSIpfWVsc2V7Zy50aXRsZT0zRF9sKCJWaWV3IGRhdGEiKTtnLmhyZWY9
M0R0aGlzLnVybHMuZD0KaXNwbGF5O3ZhciBmPTNEdGhpcztnLm9uY2xpY2s9M0RmdW5jdGlvbiho
KXtpZihHYWxheHkuZnJhbWUmJkdhbGF4eS5mcmFtZS5hPQpjdGl2ZSl7R2FsYXh5LmZyYW1lLmFk
ZCh7dGl0bGU6IkRhdGEgVmlld2VyOiAiK2YubW9kZWwuZ2V0KCJuYW1lIiksdHlwZToidXI9Cmwi
LGNvbnRlbnQ6Zi51cmxzLmRpc3BsYXl9KTtoLnByZXZlbnREZWZhdWx0KCl9fX19fWcuZmFJY29u
PTNEImZhLWV5ZSI7cmV0dT0Kcm4gZmFJY29uQnV0dG9uKGcpfSxfcmVuZGVyX2Rvd25sb2FkQnV0
dG9uOmZ1bmN0aW9uKCl7aWYodGhpcy5tb2RlbC5nZXQoInB1PQpyZ2VkIil8fCF0aGlzLm1vZGVs
Lmhhc0RhdGEoKSl7cmV0dXJuIG51bGx9dmFyIGc9M0R0aGlzLnVybHMsaD0zRHRoaXMubW9kZWw9
Ci5nZXQoIm1ldGFfZmlsZXMiKTtpZihfLmlzRW1wdHkoaCkpe3JldHVybiAkKFsnPGEgaHJlZj0z
RCInK2cuZG93bmxvYWQrJyIgdD0KaXRsZT0zRCInK19sKCJEb3dubG9hZCIpKyciICcsJ2NsYXNz
PTNEImljb24tYnRuIGRhdGFzZXQtZG93bmxvYWQtYnRuIj4nLCc8PQpzcGFuIGNsYXNzPTNEImZh
IGZhLWZsb3BweS1vIj48L3NwYW4+JywiPC9hPiJdLmpvaW4oIiIpKX12YXIgaT0zRCJkYXRhc2V0
LSI9Cit0aGlzLm1vZGVsLmdldCgiaWQiKSsiLXBvcHVwIixmPTNEWyc8ZGl2IHBvcHVwbWVudT0z
RCInK2krJyI+JywnPGEgaHJlZj0zRD0KIicrZy5kb3dubG9hZCsnIj4nLF9sKCJEb3dubG9hZCBE
YXRhc2V0IiksIjwvYT4iLCI8YT4iK19sKCJBZGRpdGlvbmFsIEZpbGVzPQoiKSsiPC9hPiIsXy5t
YXAoaCxmdW5jdGlvbihqKXtyZXR1cm5bJzxhIGNsYXNzPTNEImFjdGlvbi1idXR0b24iIGhyZWY9
M0QiJyw9CmcubWV0YV9kb3dubG9hZCtqLmZpbGVfdHlwZSwnIj4nLF9sKCJEb3dubG9hZCIpLCIg
IixqLmZpbGVfdHlwZSwiPC9hPiJdLmpvaT0KbigiIil9KS5qb2luKCJcbiIpLCI8L2Rpdj4iLCc8
ZGl2IGNsYXNzPTNEImljb24tYnRuLWdyb3VwIj4nLCc8YSBocmVmPTNEIicrPQpnLmRvd25sb2Fk
KyciIHRpdGxlPTNEIicrX2woIkRvd25sb2FkIikrJyIgJywnY2xhc3M9M0QiaWNvbi1idG4gZGF0
YXNldC1kb3c9Cm5sb2FkLWJ0biI+JywnPHNwYW4gY2xhc3M9M0QiZmEgZmEtZmxvcHB5LW8iPjwv
c3Bhbj4nLCc8L2E+PGEgY2xhc3M9M0QiaWNvbj0KLWJ0biBwb3B1cCIgaWQ9M0QiJytpKyciPics
JzxzcGFuIGNsYXNzPTNEImZhIGZhLWNhcmV0LWRvd24iPjwvc3Bhbj4nLCI8L2E+PQoiLCI8L2Rp
dj4iXS5qb2luKCJcbiIpO3JldHVybiAkKGYpfSxfcmVuZGVyX3Nob3dQYXJhbXNCdXR0b246ZnVu
Y3Rpb24oKXtyZXQ9CnVybiBmYUljb25CdXR0b24oe3RpdGxlOl9sKCJWaWV3IGRldGFpbHMiKSxj
bGFzc2VzOiJkYXRhc2V0LXBhcmFtcy1idG4iLGhyZT0KZjp0aGlzLnVybHMuc2hvd19wYXJhbXMs
dGFyZ2V0OnRoaXMubGlua1RhcmdldCxmYUljb246ImZhLWluZm8tY2lyY2xlIn0pfSxfPQpyZW5k
ZXJfYm9keTpmdW5jdGlvbigpe3ZhciBnPTNEJCgnPGRpdj5FcnJvcjogdW5rbm93biBkYXRhc2V0
IHN0YXRlICInK3RoaXM9Ci5tb2RlbC5nZXQoInN0YXRlIikrJyIuPC9kaXY+JyksZj0zRHRoaXNb
Il9yZW5kZXJfYm9keV8iK3RoaXMubW9kZWwuZ2V0KCJzdD0KYXRlIildO2lmKF8uaXNGdW5jdGlv
bihmKSl7Zz0zRGYuY2FsbCh0aGlzKX10aGlzLl9zZXRVcEJlaGF2aW9ycyhnKTtpZih0aGlzPQou
ZXhwYW5kZWQpe2cuc2hvdygpfXJldHVybiBnfSxfcmVuZGVyX3N0YXRlQm9keUhlbHBlcjpmdW5j
dGlvbihmLGkpe2k9M0RpfHw9CltdO3ZhciBnPTNEdGhpcyxoPTNEJChjLnRlbXBsYXRlcy5ib2R5
KF8uZXh0ZW5kKHRoaXMubW9kZWwudG9KU09OKCkse2JvZHk6Zj0KfSkpKTtoLmZpbmQoIi5kYXRh
c2V0LWFjdGlvbnMgLmxlZnQiKS5hcHBlbmQoXy5tYXAoaSxmdW5jdGlvbihqKXtyZXR1cm4gai5j
PQphbGwoZyl9KSk7cmV0dXJuIGh9LF9yZW5kZXJfYm9keV9uZXc6ZnVuY3Rpb24oKXtyZXR1cm4g
dGhpcy5fcmVuZGVyX3N0YXRlQm89CmR5SGVscGVyKCI8ZGl2PiIrX2woIlRoaXMgaXMgYSBuZXcg
ZGF0YXNldCBhbmQgbm90IGFsbCBvZiBpdHMgZGF0YSBhcmUgYXZhaT0KbGFibGUgeWV0IikrIjwv
ZGl2PiIsdGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVycyl9LF9yZW5kZXJf
Ym9kPQp5X25vUGVybWlzc2lvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJfc3RhdGVC
b2R5SGVscGVyKCI8ZGl2PiIrX2woIlk9Cm91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmll
dyB0aGlzIGRhdGFzZXQiKSsiPC9kaXY+Iil9LF9yZW5kZXJfYm9keV9kaT0Kc2NhcmRlZDpmdW5j
dGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJfc3RhdGVCb2R5SGVscGVyKCI8ZGl2PiIrX2woIlRo
ZSBqb2IgPQpjcmVhdGluZyB0aGlzIGRhdGFzZXQgd2FzIGNhbmNlbGxlZCBiZWZvcmUgY29tcGxl
dGlvbiIpKyI8L2Rpdj4iLHRoaXMuZGVmYXU9Cmx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVy
cyl9LF9yZW5kZXJfYm9keV9xdWV1ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz0KLl9yZW5kZXJf
c3RhdGVCb2R5SGVscGVyKCI8ZGl2PiIrX2woIlRoaXMgam9iIGlzIHdhaXRpbmcgdG8gcnVuIikr
IjwvZGl2PiIsPQp0aGlzLmRlZmF1bHRQcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJzKX0sX3Jl
bmRlcl9ib2R5X3VwbG9hZDpmdW5jdGlvbigpe3I9CmV0dXJuIHRoaXMuX3JlbmRlcl9zdGF0ZUJv
ZHlIZWxwZXIoIjxkaXY+IitfbCgiVGhpcyBkYXRhc2V0IGlzIGN1cnJlbnRseSB1cD0KbG9hZGlu
ZyIpKyI8L2Rpdj4iKX0sX3JlbmRlcl9ib2R5X3NldHRpbmdfbWV0YWRhdGE6ZnVuY3Rpb24oKXty
ZXR1cm4gdGhpcy5fPQpyZW5kZXJfc3RhdGVCb2R5SGVscGVyKCI8ZGl2PiIrX2woIk1ldGFkYXRh
IGlzIGJlaW5nIGF1dG8tZGV0ZWN0ZWQiKSsiPC9kaXY9Cj4iKX0sX3JlbmRlcl9ib2R5X3J1bm5p
bmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVuZGVyX3N0YXRlQm9keUhlbHBlcigiPD0KZGl2
PiIrX2woIlRoaXMgam9iIGlzIGN1cnJlbnRseSBydW5uaW5nIikrIjwvZGl2PiIsdGhpcy5kZWZh
dWx0UHJpbWFyeUFjdGlvPQpuQnV0dG9uUmVuZGVyZXJzKX0sX3JlbmRlcl9ib2R5X3BhdXNlZDpm
dW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJfc3RhdGU9CkJvZHlIZWxwZXIoIjxkaXY+Iitf
bCgnVGhpcyBqb2IgaXMgcGF1c2VkLiBVc2UgdGhlICJSZXN1bWUgUGF1c2VkIEpvYnMiIGluID0K
dGhlIGhpc3RvcnkgbWVudSB0byByZXN1bWUnKSsiPC9kaXY+Iix0aGlzLmRlZmF1bHRQcmltYXJ5
QWN0aW9uQnV0dG9uUmVuZGVyPQplcnMpfSxfcmVuZGVyX2JvZHlfZXJyb3I6ZnVuY3Rpb24oKXt2
YXIgZj0zRFsnPHNwYW4gY2xhc3M9M0QiaGVscC10ZXh0Ij4nLF89CmwoIkFuIGVycm9yIG9jY3Vy
cmVkIHdpdGggdGhpcyBkYXRhc2V0IiksIjo8L3NwYW4+IiwnPGRpdiBjbGFzcz0zRCJqb2ItZXJy
bz0Kci10ZXh0Ij4nLCQudHJpbSh0aGlzLm1vZGVsLmdldCgibWlzY19pbmZvIikpLCI8L2Rpdj4i
XS5qb2luKCIiKTtpZighdGhpcy5tPQpvZGVsLmdldCgicHVyZ2VkIikpe2Y9M0QiPGRpdj4iK3Ro
aXMubW9kZWwuZ2V0KCJtaXNjX2JsdXJiIikrIjwvZGl2PiIrZn1yZXQ9CnVybiB0aGlzLl9yZW5k
ZXJfc3RhdGVCb2R5SGVscGVyKGYsW3RoaXMuX3JlbmRlcl9kb3dubG9hZEJ1dHRvbl0uY29uY2F0
KHRoaT0Kcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVycykpfSxfcmVuZGVyX2Jv
ZHlfZW1wdHk6ZnVuY3Rpb24oKXtyZXR1PQpybiB0aGlzLl9yZW5kZXJfc3RhdGVCb2R5SGVscGVy
KCI8ZGl2PiIrX2woIk5vIGRhdGEiKSsiOiA8aT4iK3RoaXMubW9kZWwuZ2U9CnQoIm1pc2NfYmx1
cmIiKSsiPC9pPjwvZGl2PiIsdGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVy
cyl9LF9yZT0KbmRlcl9ib2R5X2ZhaWxlZF9tZXRhZGF0YTpmdW5jdGlvbigpe3ZhciBmPTNEJCgn
PGRpdiBjbGFzcz0zRCJ3YXJuaW5nbWVzc2FnPQplc21hbGwiPjwvZGl2PicpLmFwcGVuZCgkKCI8
c3Ryb25nLz4iKS50ZXh0KF9sKCJBbiBlcnJvciBvY2N1cnJlZCBzZXR0aW5nIHQ9CmhlIG1ldGFk
YXRhIGZvciB0aGlzIGRhdGFzZXQiKSkpLGc9M0R0aGlzLl9yZW5kZXJfYm9keV9vaygpO2cucHJl
cGVuZChmKTtyZT0KdHVybiBnfSxfcmVuZGVyX2JvZHlfb2s6ZnVuY3Rpb24oKXt2YXIgZj0zRHRo
aXMsaD0zRCQoYy50ZW1wbGF0ZXMuYm9keSh0aGlzPQoubW9kZWwudG9KU09OKCkpKSxnPTNEW3Ro
aXMuX3JlbmRlcl9kb3dubG9hZEJ1dHRvbl0uY29uY2F0KHRoaXMuZGVmYXVsdFByaW09CmFyeUFj
dGlvbkJ1dHRvblJlbmRlcmVycyk7aC5maW5kKCIuZGF0YXNldC1hY3Rpb25zIC5sZWZ0IikuYXBw
ZW5kKF8ubWFwKGcsZj0KdW5jdGlvbihpKXtyZXR1cm4gaS5jYWxsKGYpfSkpO2lmKHRoaXMubW9k
ZWwuaXNEZWxldGVkT3JQdXJnZWQoKSl7cmV0dXJuIGh9PQpyZXR1cm4gaH0sZXZlbnRzOnsiY2xp
Y2sgLmRhdGFzZXQtdGl0bGUtYmFyIjoidG9nZ2xlQm9keVZpc2liaWxpdHkiLCJrZXlkb3c9Cm4g
LmRhdGFzZXQtdGl0bGUtYmFyIjoidG9nZ2xlQm9keVZpc2liaWxpdHkiLCJjbGljayAuZGF0YXNl
dC1zZWxlY3RvciI6InRvZz0KZ2xlU2VsZWN0In0sdG9nZ2xlQm9keVZpc2liaWxpdHk6ZnVuY3Rp
b24oaSxnKXt2YXIgZj0zRDMyLGg9M0QxMztpZihpJiYoaS50PQp5cGU9M0Q9M0Q9M0Qia2V5ZG93
biIpJiYhKGkua2V5Q29kZT0zRD0zRD0zRGZ8fGkua2V5Q29kZT0zRD0zRD0zRGgpKXtyZXR1cm49
CiB0cnVlfXZhciBqPTNEdGhpcy4kZWwuZmluZCgiLmRhdGFzZXQtYm9keSIpO2c9M0QoZz0zRD0z
RD0zRHVuZGVmaW5lZCk/KCFqLj0KaXMoIjp2aXNpYmxlIikpOihnKTtpZihnKXt0aGlzLmV4cGFu
ZEJvZHkoKX1lbHNle3RoaXMuY29sbGFwc2VCb2R5KCl9cmV0dXJuPQogZmFsc2V9LGV4cGFuZEJv
ZHk6ZnVuY3Rpb24oKXt2YXIgZj0zRHRoaXM7ZnVuY3Rpb24gZygpe2YuJGVsLmNoaWxkcmVuKCIu
ZGE9CnRhc2V0LWJvZHkiKS5yZXBsYWNlV2l0aChmLl9yZW5kZXJfYm9keSgpKTtmLiRlbC5jaGls
ZHJlbigiLmRhdGFzZXQtYm9keSIpLj0Kc2xpZGVEb3duKGYuZnhTcGVlZCxmdW5jdGlvbigpe2Yu
ZXhwYW5kZWQ9M0R0cnVlO2YudHJpZ2dlcigiYm9keS1leHBhbmRlZCIsPQpmLm1vZGVsLmdldCgi
aWQiKSl9KX1pZih0aGlzLm1vZGVsLmluUmVhZHlTdGF0ZSgpJiYhdGhpcy5tb2RlbC5oYXNEZXRh
aWxzKCk9Cil7dGhpcy5tb2RlbC5mZXRjaCh7c2lsZW50OnRydWV9KS5hbHdheXMoZnVuY3Rpb24o
aCl7Zi51cmxzPTNEZi5tb2RlbC51cmxzKD0KKTtnKCl9KX1lbHNle2coKX19LGNvbGxhcHNlQm9k
eTpmdW5jdGlvbigpe3ZhciBmPTNEdGhpczt0aGlzLiRlbC5jaGlsZHJlbigiPQouZGF0YXNldC1i
b2R5Iikuc2xpZGVVcChmLmZ4U3BlZWQsZnVuY3Rpb24oKXtmLmV4cGFuZGVkPTNEZmFsc2U7Zi50
cmlnZ2VyKCI9CmJvZHktY29sbGFwc2VkIixmLm1vZGVsLmdldCgiaWQiKSl9KX0sc2hvd1NlbGVj
dG9yOmZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlYz0KdGVkKXt0aGlzLnNlbGVjdChudWxsLHRydWUp
fXRoaXMuc2VsZWN0YWJsZT0zRHRydWU7dGhpcy50cmlnZ2VyKCJzZWxlY3RhYmxlPQoiLHRydWUs
dGhpcyk7dGhpcy4kKCIuZGF0YXNldC1wcmltYXJ5LWFjdGlvbnMiKS5oaWRlKCk7dGhpcy4kKCIu
ZGF0YXNldC1zZWw9CmVjdG9yIikuc2hvdygpfSxoaWRlU2VsZWN0b3I6ZnVuY3Rpb24oKXt0aGlz
LnNlbGVjdGFibGU9M0RmYWxzZTt0aGlzLnRyaWdnZT0Kcigic2VsZWN0YWJsZSIsZmFsc2UsdGhp
cyk7dGhpcy4kKCIuZGF0YXNldC1zZWxlY3RvciIpLmhpZGUoKTt0aGlzLiQoIi5kYXRhPQpzZXQt
cHJpbWFyeS1hY3Rpb25zIikuc2hvdygpfSx0b2dnbGVTZWxlY3RvcjpmdW5jdGlvbigpe2lmKCF0
aGlzLiRlbC5maW5kKCI9Ci5kYXRhc2V0LXNlbGVjdG9yIikuaXMoIjp2aXNpYmxlIikpe3RoaXMu
c2hvd1NlbGVjdG9yKCl9ZWxzZXt0aGlzLmhpZGVTZWxlYz0KdG9yKCl9fSxzZWxlY3Q6ZnVuY3Rp
b24oZil7dGhpcy4kZWwuZmluZCgiLmRhdGFzZXQtc2VsZWN0b3Igc3BhbiIpLnJlbW92ZUNsPQph
c3MoImZhLXNxdWFyZS1vIikuYWRkQ2xhc3MoImZhLWNoZWNrLXNxdWFyZS1vIik7aWYoIXRoaXMu
c2VsZWN0ZWQpe3RoaXMudHI9CmlnZ2VyKCJzZWxlY3RlZCIsdGhpcyk7dGhpcy5zZWxlY3RlZD0z
RHRydWV9cmV0dXJuIGZhbHNlfSxkZXNlbGVjdDpmdW5jdGlvbj0KKGYpe3RoaXMuJGVsLmZpbmQo
Ii5kYXRhc2V0LXNlbGVjdG9yIHNwYW4iKS5yZW1vdmVDbGFzcygiZmEtY2hlY2stc3F1YXJlLW8i
PQopLmFkZENsYXNzKCJmYS1zcXVhcmUtbyIpO2lmKHRoaXMuc2VsZWN0ZWQpe3RoaXMudHJpZ2dl
cigiZGUtc2VsZWN0ZWQiLHRoaXM9Cik7dGhpcy5zZWxlY3RlZD0zRGZhbHNlfXJldHVybiBmYWxz
ZX0sdG9nZ2xlU2VsZWN0OmZ1bmN0aW9uKGYpe2lmKHRoaXMuc2VsZT0KY3RlZCl7dGhpcy5kZXNl
bGVjdChmKX1lbHNle3RoaXMuc2VsZWN0KGYpfX0sZHJhZ2dhYmxlT246ZnVuY3Rpb24oKXt0aGlz
LmRyPQphZ2dhYmxlPTNEdHJ1ZTt0aGlzLmRyYWdTdGFydEhhbmRsZXI9M0RfLmJpbmQodGhpcy5f
ZHJhZ1N0YXJ0SGFuZGxlcix0aGlzKTs9CnRoaXMuZHJhZ0VuZEhhbmRsZXI9M0RfLmJpbmQodGhp
cy5fZHJhZ0VuZEhhbmRsZXIsdGhpcyk7dmFyIGY9M0R0aGlzLiRlbC5maT0KbmQoIi5kYXRhc2V0
LXRpdGxlLWJhciIpLmF0dHIoImRyYWdnYWJsZSIsdHJ1ZSkuZ2V0KDApO2YuYWRkRXZlbnRMaXN0
ZW5lcigiPQpkcmFnc3RhcnQiLHRoaXMuZHJhZ1N0YXJ0SGFuZGxlcixmYWxzZSk7Zi5hZGRFdmVu
dExpc3RlbmVyKCJkcmFnZW5kIix0aGlzLmQ9CnJhZ0VuZEhhbmRsZXIsZmFsc2UpfSxkcmFnZ2Fi
bGVPZmY6ZnVuY3Rpb24oKXt0aGlzLmRyYWdnYWJsZT0zRGZhbHNlO3ZhciBmPQo9M0R0aGlzLiRl
bC5maW5kKCIuZGF0YXNldC10aXRsZS1iYXIiKS5hdHRyKCJkcmFnZ2FibGUiLGZhbHNlKS5nZXQo
MCk7Zi5yZW09Cm92ZUV2ZW50TGlzdGVuZXIoImRyYWdzdGFydCIsdGhpcy5kcmFnU3RhcnRIYW5k
bGVyLGZhbHNlKTtmLnJlbW92ZUV2ZW50TGlzdD0KZW5lcigiZHJhZ2VuZCIsdGhpcy5kcmFnRW5k
SGFuZGxlcixmYWxzZSl9LHRvZ2dsZURyYWdnYWJsZTpmdW5jdGlvbigpe2lmKHRoPQppcy5kcmFn
Z2FibGUpe3RoaXMuZHJhZ2dhYmxlT2ZmKCl9ZWxzZXt0aGlzLmRyYWdnYWJsZU9uKCl9fSxfZHJh
Z1N0YXJ0SGFuZGw9CmVyOmZ1bmN0aW9uKGYpe3RoaXMudHJpZ2dlcigiZHJhZ3N0YXJ0Iix0aGlz
KTtmLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPQo9M0QibW92ZSI7Zi5kYXRhVHJhbnNmZXIu
c2V0RGF0YSgidGV4dCIsSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbC50b0pTT04oKSk9Cik7cmV0
dXJuIGZhbHNlfSxfZHJhZ0VuZEhhbmRsZXI6ZnVuY3Rpb24oZil7dGhpcy50cmlnZ2VyKCJkcmFn
ZW5kIix0aGlzKTtyZT0KdHVybiBmYWxzZX0scmVtb3ZlOmZ1bmN0aW9uKGcpe3ZhciBmPTNEdGhp
czt0aGlzLiRlbC5mYWRlT3V0KGYuZnhTcGVlZCxmdW5jPQp0aW9uKCl7Zi4kZWwucmVtb3ZlKCk7
Zi5vZmYoKTtpZihnKXtnKCl9fSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGY9M0QodGg9Cmlz
Lm1vZGVsKT8odGhpcy5tb2RlbCsiIik6KCIobm8gbW9kZWwpIik7cmV0dXJuIkhEQUJhc2VWaWV3
KCIrZisiKSJ9fSk7dmFyID0KYT0zRFsnPGRpdiBjbGFzcz0zRCJkYXRhc2V0IGhkYSI+JywnPGRp
diBjbGFzcz0zRCJkYXRhc2V0LXdhcm5pbmdzIj4nLCI8JSBpPQpmKCBoZGEuZXJyb3IgKXsgJT4i
LCc8ZGl2IGNsYXNzPTNEImVycm9ybWVzc2FnZXNtYWxsIj4nLF9sKCJUaGVyZSB3YXMgYW4gZXI9
CnJvciBnZXR0aW5nIHRoZSBkYXRhIGZvciB0aGlzIGRhdGFzZXQiKSwiOjwlLSBoZGEuZXJyb3Ig
JT4iLCI8L2Rpdj4iLCI8JSB9ID0KJT4iLCI8JSBpZiggaGRhLmRlbGV0ZWQgKXsgJT4iLCI8JSBp
ZiggaGRhLnB1cmdlZCApeyAlPiIsJzxkaXYgY2xhc3M9M0QiZGF0PQphc2V0LXB1cmdlZC1tc2cg
d2FybmluZ21lc3NhZ2VzbWFsbCI+PHN0cm9uZz4nLF9sKCJUaGlzIGRhdGFzZXQgaGFzIGJlZW4g
ZGU9CmxldGVkIGFuZCByZW1vdmVkIGZyb20gZGlzay4iKSwiPC9zdHJvbmc+PC9kaXY+IiwiPCUg
fSBlbHNlIHsgJT4iLCc8ZGl2IGNsYT0Kc3M9M0QiZGF0YXNldC1kZWxldGVkLW1zZyB3YXJuaW5n
bWVzc2FnZXNtYWxsIj48c3Ryb25nPicsX2woIlRoaXMgZGF0YXNldCBoPQphcyBiZWVuIGRlbGV0
ZWQuIiksIjwvc3Ryb25nPjwvZGl2PiIsIjwlIH0gJT4iLCI8JSB9ICU+IiwiPCUgaWYoICFoZGEu
dmlzaWI9CmxlICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWhpZGRlbi1tc2cgd2Fybmlu
Z21lc3NhZ2VzbWFsbCI+PHN0cm9uZz4nLD0KX2woIlRoaXMgZGF0YXNldCBoYXMgYmVlbiBoaWRk
ZW4uIiksIjwvc3Ryb25nPjwvZGl2PiIsIjwlIH0gJT4iLCI8L2Rpdj4iLCc8PQpkaXYgY2xhc3M9
M0QiZGF0YXNldC1zZWxlY3RvciI+JywnPHNwYW4gY2xhc3M9M0QiZmEgZmEtMnggZmEtc3F1YXJl
LW8iPjwvc3A9CmFuPicsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiZGF0YXNldC1wcmltYXJ5LWFj
dGlvbnMiPjwvZGl2PicsJzxkaXYgY2xhc3M9Cj0zRCJkYXRhc2V0LXRpdGxlLWJhciBjbGVhciIg
dGFiaW5kZXg9M0QiMCI+JywnPHNwYW4gY2xhc3M9M0QiZGF0YXNldC1zdGF0ZT0KLWljb24gc3Rh
dGUtaWNvbiI+PC9zcGFuPicsJzxkaXYgY2xhc3M9M0QiZGF0YXNldC10aXRsZSI+JywnPHNwYW4g
Y2xhc3M9M0QiPQpoZGEtaGlkIj48JS0gaGRhLmhpZCAlPjwvc3Bhbj4gJywnPHNwYW4gY2xhc3M9
M0QiZGF0YXNldC1uYW1lIj48JS0gaGRhLm5hbWU9CiAlPjwvc3Bhbj4nLCI8L2Rpdj4iLCI8L2Rp
dj4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtYm9keSI+PC9kaXY+JywiPC9kaXY+Ij0KXS5qb2lu
KCIiKTt2YXIgZT0zRFsnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWJvZHkiPicsIjwlIGlmKCBoZGEu
Ym9keSApeyAlPiIsPQonPGRpdiBjbGFzcz0zRCJkYXRhc2V0LXN1bW1hcnkiPicsIjwlPTNEIGhk
YS5ib2R5ICU+IiwiPC9kaXY+IiwnPGRpdiBjbGFzcz0KPTNEImRhdGFzZXQtYWN0aW9ucyBjbGVh
ciI+JywnPGRpdiBjbGFzcz0zRCJsZWZ0Ij48L2Rpdj4nLCc8ZGl2IGNsYXNzPTNEInJpPQpnaHQi
PjwvZGl2PicsIjwvZGl2PiIsIjwlIH0gZWxzZSB7ICU+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0
LXN1bW1hcnkiPicsIjw9CiUgaWYoIGhkYS5taXNjX2JsdXJiICl7ICU+IiwnPGRpdiBjbGFzcz0z
RCJkYXRhc2V0LWJsdXJiIj4nLCc8c3BhbiBjbGFzcz0zRD0KInZhbHVlIj48JS0gaGRhLm1pc2Nf
Ymx1cmIgJT48L3NwYW4+JywiPC9kaXY+IiwiPCUgfSAlPiIsIjwlIGlmKCBoZGEuZGF0YV90PQp5
cGUgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtZGF0YXR5cGUiPicsJzxsYWJlbCBjbGFz
cz0zRCJwcm9tcHQiPicsX2w9CigiZm9ybWF0IiksIjwvbGFiZWw+IiwnPHNwYW4gY2xhc3M9M0Qi
dmFsdWUiPjwlLSBoZGEuZGF0YV90eXBlICU+PC9zcGFuPicsIj0KPC9kaXY+IiwiPCUgfSAlPiIs
IjwlIGlmKCBoZGEubWV0YWRhdGFfZGJrZXkgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQt
PQpkYmtleSI+JywnPGxhYmVsIGNsYXNzPTNEInByb21wdCI+JyxfbCgiZGF0YWJhc2UiKSwiPC9s
YWJlbD4iLCc8c3BhbiBjbGFzcz0KPTNEInZhbHVlIj4nLCI8JS0gaGRhLm1ldGFkYXRhX2Ria2V5
ICU+IiwiPC9zcGFuPiIsIjwvZGl2PiIsIjwlIH0gJT4iLCI8JSBpPQpmKCBoZGEubWlzY19pbmZv
ICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWluZm8iPicsJzxzcGFuIGNsYXNzPTNEInZh
bHU9CmUiPjwlLSBoZGEubWlzY19pbmZvICU+PC9zcGFuPicsIjwvZGl2PiIsIjwlIH0gJT4iLCI8
L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEIj0KZGF0YXNldC1hY3Rpb25zIGNsZWFyIj4nLCc8ZGl2IGNs
YXNzPTNEImxlZnQiPjwvZGl2PicsJzxkaXYgY2xhc3M9M0QicmlnaHQiPQo+PC9kaXY+JywiPC9k
aXY+IiwiPCUgaWYoICFoZGEuZGVsZXRlZCApeyAlPiIsJzxkaXYgY2xhc3M9M0QidGFncy1kaXNw
bGF5Ij49CjwvZGl2PicsJzxkaXYgY2xhc3M9M0QiYW5ub3RhdGlvbi1kaXNwbGF5Ij48L2Rpdj4n
LCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtZD0KaXNwbGF5LWFwcGxpY2F0aW9ucyI+JywiPCUgXy5l
YWNoKCBoZGEuZGlzcGxheV9hcHBzLCBmdW5jdGlvbiggYXBwICl7ICU+IiwnPQo8ZGl2IGNsYXNz
PTNEImRpc3BsYXktYXBwbGljYXRpb24iPicsJzxzcGFuIGNsYXNzPTNEImRpc3BsYXktYXBwbGlj
YXRpb24tbG89CmNhdGlvbiI+PCUtIGFwcC5sYWJlbCAlPjwvc3Bhbj4gJywnPHNwYW4gY2xhc3M9
M0QiZGlzcGxheS1hcHBsaWNhdGlvbi1saW5rcz0KIj4nLCI8JSBfLmVhY2goIGFwcC5saW5rcywg
ZnVuY3Rpb24oIGxpbmsgKXsgJT4iLCc8YSB0YXJnZXQ9M0QiPCU9M0QgbGluay50PQphcmdldCAl
PiIgaHJlZj0zRCI8JT0zRCBsaW5rLmhyZWYgJT4iPicsIjwlIHByaW50KCBfbCggbGluay50ZXh0
ICkgKTsgJT4iLCI9CjwvYT4gIiwiPCUgfSk7ICU+IiwiPC9zcGFuPiIsIjwvZGl2PiIsIjwlIH0p
OyAlPiIsIjwlIF8uZWFjaCggaGRhLmRpc3BsYXlfdD0KeXBlcywgZnVuY3Rpb24oIGFwcCApeyAl
PiIsJzxkaXYgY2xhc3M9M0QiZGlzcGxheS1hcHBsaWNhdGlvbiI+JywnPHNwYW4gY2xhPQpzcz0z
RCJkaXNwbGF5LWFwcGxpY2F0aW9uLWxvY2F0aW9uIj48JS0gYXBwLmxhYmVsICU+PC9zcGFuPiAn
LCc8c3BhbiBjbGFzcz0KPTNEImRpc3BsYXktYXBwbGljYXRpb24tbGlua3MiPicsIjwlIF8uZWFj
aCggYXBwLmxpbmtzLCBmdW5jdGlvbiggbGluayApeyAlPQo+IiwnPGEgdGFyZ2V0PTNEIjwlPTNE
IGxpbmsudGFyZ2V0ICU+IiBocmVmPTNEIjwlPTNEIGxpbmsuaHJlZiAlPiI+JywiPCUgcHI9Cmlu
dCggX2woIGxpbmsudGV4dCApICk7ICU+IiwiPC9hPiAiLCI8JSB9KTsgJT4iLCI8L3NwYW4+Iiwi
PC9kaXY+IiwiPCUgfSk7ID0KJT4iLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtcGVl
ayI+JywiPCUgaWYoIGhkYS5wZWVrICl7ICU+IiwnPHByZSBjPQpsYXNzPTNEInBlZWsiPjwlPTNE
IGhkYS5wZWVrICU+PC9wcmU+JywiPCUgfSAlPiIsIjwvZGl2PiIsIjwlIH0gJT4iLCI8JSB9ICU9
Cj4iLCI8L2Rpdj4iXS5qb2luKCIiKTtjLnRlbXBsYXRlcz0zRHtza2VsZXRvbjpmdW5jdGlvbihm
KXtyZXR1cm4gXy50ZW1wbGF0ZT0KKGEsZix7dmFyaWFibGU6ImhkYSJ9KX0sYm9keTpmdW5jdGlv
bihmKXtyZXR1cm4gXy50ZW1wbGF0ZShlLGYse3ZhcmlhYmxlOiJoPQpkYSJ9KX19O3JldHVybntI
REFCYXNlVmlldzpjfX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2RlZmluZShbIm12
Yy9kYXRhc2V0L2hkYS1tb2RlbCIsIm12Yy9iYXNlLW12YyIsInV0aWxzL2xvY2FsaXphdGlvbiJd
LGZ1bmN0PQppb24oZSxiLGQpe3ZhciBjPTNEQmFja2JvbmUuVmlldy5leHRlbmQoYi5Mb2dnYWJs
ZU1peGluKS5leHRlbmQoe3RhZ05hbWU6ImQ9Cml2IixjbGFzc05hbWU6ImRhdGFzZXQgaGRhIGhp
c3RvcnktcGFuZWwtaGRhIixpZDpmdW5jdGlvbigpe3JldHVybiJoZGEtIit0aD0KaXMubW9kZWwu
Z2V0KCJpZCIpfSxmeFNwZWVkOiJmYXN0Iixpbml0aWFsaXplOmZ1bmN0aW9uKGcpe2lmKGcubG9n
Z2VyKXt0aGlzPQoubG9nZ2VyPTNEdGhpcy5tb2RlbC5sb2dnZXI9M0RnLmxvZ2dlcn10aGlzLmxv
Zyh0aGlzKyIuaW5pdGlhbGl6ZToiLGcpO3RoaXM9Ci5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRv
blJlbmRlcmVycz0zRFt0aGlzLl9yZW5kZXJfc2hvd1BhcmFtc0J1dHRvbl07dGhpcz0KLmxpbmtU
YXJnZXQ9M0RnLmxpbmtUYXJnZXR8fCJfYmxhbmsiO3RoaXMuc2VsZWN0YWJsZT0zRGcuc2VsZWN0
YWJsZXx8ZmFsc2U7PQp0aGlzLnNlbGVjdGVkPTNEZy5zZWxlY3RlZHx8ZmFsc2U7dGhpcy5leHBh
bmRlZD0zRGcuZXhwYW5kZWR8fGZhbHNlO3RoaXMuZHI9CmFnZ2FibGU9M0RnLmRyYWdnYWJsZXx8
ZmFsc2U7dGhpcy5fc2V0VXBMaXN0ZW5lcnMoKX0sX3NldFVwTGlzdGVuZXJzOmZ1bmN0aT0Kb24o
KXt0aGlzLm1vZGVsLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKGgsZyl7aWYodGhpcy5tb2RlbC5jaGFu
Z2VkQXR0cmlidXRlcygpPQouc3RhdGUmJnRoaXMubW9kZWwuaW5SZWFkeVN0YXRlKCkmJnRoaXMu
ZXhwYW5kZWQmJiF0aGlzLm1vZGVsLmhhc0RldGFpbHMoKSk9Cnt0aGlzLm1vZGVsLmZldGNoKCl9
ZWxzZXt0aGlzLnJlbmRlcigpfX0sdGhpcyl9LHJlbmRlcjpmdW5jdGlvbihpKXtpPTNEKGk9Cj0z
RD0zRD0zRHVuZGVmaW5lZCk/KHRydWUpOihpKTt2YXIgZz0zRHRoaXM7dGhpcy4kZWwuZmluZCgi
W3RpdGxlXSIpLnRvb2x0aT0KcCgiZGVzdHJveSIpO3RoaXMudXJscz0zRHRoaXMubW9kZWwudXJs
cygpO3ZhciBoPTNEdGhpcy5fYnVpbGROZXdSZW5kZXIoKTtpPQpmKGkpeyQoZykucXVldWUoZnVu
Y3Rpb24oail7dGhpcy4kZWwuZmFkZU91dChnLmZ4U3BlZWQsail9KX0kKGcpLnF1ZXVlKGZ1bmM9
CnRpb24oail7dGhpcy4kZWwuZW1wdHkoKS5hdHRyKCJjbGFzcyIsZy5jbGFzc05hbWUpLmFkZENs
YXNzKCJzdGF0ZS0iK2cubW9kZT0KbC5nZXQoInN0YXRlIikpLmFwcGVuZChoLmNoaWxkcmVuKCkp
O2lmKHRoaXMuc2VsZWN0YWJsZSl7dGhpcy5zaG93U2VsZWN0b3IoPQowKX1qKCl9KTtpZihpKXsk
KGcpLnF1ZXVlKGZ1bmN0aW9uKGope3RoaXMuJGVsLmZhZGVJbihnLmZ4U3BlZWQsail9KX0kKGcp
LnE9CnVldWUoZnVuY3Rpb24oail7dGhpcy50cmlnZ2VyKCJyZW5kZXJlZCIsZyk7aWYodGhpcy5t
b2RlbC5pblJlYWR5U3RhdGUoKSl7dD0KaGlzLnRyaWdnZXIoInJlbmRlcmVkOnJlYWR5IixnKX1p
Zih0aGlzLmRyYWdnYWJsZSl7dGhpcy5kcmFnZ2FibGVPbigpfWooKX0pPQo7cmV0dXJuIHRoaXN9
LF9idWlsZE5ld1JlbmRlcjpmdW5jdGlvbigpe3ZhciBnPTNEJChjLnRlbXBsYXRlcy5za2VsZXRv
bih0aGk9CnMubW9kZWwudG9KU09OKCkpKTtnLmZpbmQoIi5kYXRhc2V0LXByaW1hcnktYWN0aW9u
cyIpLmFwcGVuZCh0aGlzLl9yZW5kZXJfdD0KaXRsZUJ1dHRvbnMoKSk7Zy5jaGlsZHJlbigiLmRh
dGFzZXQtYm9keSIpLnJlcGxhY2VXaXRoKHRoaXMuX3JlbmRlcl9ib2R5KCkpPQo7dGhpcy5fc2V0
VXBCZWhhdmlvcnMoZyk7cmV0dXJuIGd9LF9zZXRVcEJlaGF2aW9yczpmdW5jdGlvbihnKXtnPTNE
Z3x8dGhpcy49CiRlbDttYWtlX3BvcHVwX21lbnVzKGcpO2cuZmluZCgiW3RpdGxlXSIpLnRvb2x0
aXAoe3BsYWNlbWVudDoiYm90dG9tIn0pfSxfcj0KZW5kZXJfdGl0bGVCdXR0b25zOmZ1bmN0aW9u
KCl7cmV0dXJuW3RoaXMuX3JlbmRlcl9kaXNwbGF5QnV0dG9uKCldfSxfcmVuZGVyPQpfZGlzcGxh
eUJ1dHRvbjpmdW5jdGlvbigpe2lmKCh0aGlzLm1vZGVsLmdldCgic3RhdGUiKT0zRD0zRD0zRGUu
SGlzdG9yeURhdGE9CnNldEFzc29jaWF0aW9uLlNUQVRFUy5OT1RfVklFV0FCTEUpfHwodGhpcy5t
b2RlbC5nZXQoInN0YXRlIik9M0Q9M0Q9M0RlLkhpcz0KdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5T
VEFURVMuRElTQ0FSREVEKXx8KCF0aGlzLm1vZGVsLmdldCgiYWNjZXNzaWJsZSIpKSl7PQpyZXR1
cm4gbnVsbH12YXIgaD0zRHt0YXJnZXQ6dGhpcy5saW5rVGFyZ2V0LGNsYXNzZXM6ImRhdGFzZXQt
ZGlzcGxheSJ9O2lmKHQ9Cmhpcy5tb2RlbC5nZXQoInB1cmdlZCIpKXtoLmRpc2FibGVkPTNEdHJ1
ZTtoLnRpdGxlPTNEZCgiQ2Fubm90IGRpc3BsYXkgZGF0YT0Kc2V0cyByZW1vdmVkIGZyb20gZGlz
ayIpfWVsc2V7aWYodGhpcy5tb2RlbC5nZXQoInN0YXRlIik9M0Q9M0Q9M0RlLkhpc3RvcnlEPQph
dGFzZXRBc3NvY2lhdGlvbi5TVEFURVMuVVBMT0FEKXtoLmRpc2FibGVkPTNEdHJ1ZTtoLnRpdGxl
PTNEZCgiVGhpcyBkYXRhc2U9CnQgbXVzdCBmaW5pc2ggdXBsb2FkaW5nIGJlZm9yZSBpdCBjYW4g
YmUgdmlld2VkIil9ZWxzZXtpZih0aGlzLm1vZGVsLmdldCgicz0KdGF0ZSIpPTNEPTNEPTNEZS5I
aXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRFUy5ORVcpe2guZGlzYWJsZWQ9M0R0cnVlO2gu
PQp0aXRsZT0zRGQoIlRoaXMgZGF0YXNldCBpcyBub3QgeWV0IHZpZXdhYmxlIil9ZWxzZXtoLnRp
dGxlPTNEZCgiVmlldyBkYXRhIik9CjtoLmhyZWY9M0R0aGlzLnVybHMuZGlzcGxheTt2YXIgZz0z
RHRoaXM7aC5vbmNsaWNrPTNEZnVuY3Rpb24oaSl7aWYoR2FsYXh5Lj0KZnJhbWUmJkdhbGF4eS5m
cmFtZS5hY3RpdmUpe0dhbGF4eS5mcmFtZS5hZGQoe3RpdGxlOiJEYXRhIFZpZXdlcjogIitnLm1v
ZGVsPQouZ2V0KCJuYW1lIiksdHlwZToidXJsIixjb250ZW50OmcudXJscy5kaXNwbGF5fSk7aS5w
cmV2ZW50RGVmYXVsdCgpfX19fX1oLmY9CmFJY29uPTNEImZhLWV5ZSI7cmV0dXJuIGZhSWNvbkJ1
dHRvbihoKX0sX3JlbmRlcl9kb3dubG9hZEJ1dHRvbjpmdW5jdGlvbigpez0KaWYodGhpcy5tb2Rl
bC5nZXQoInB1cmdlZCIpfHwhdGhpcy5tb2RlbC5oYXNEYXRhKCkpe3JldHVybiBudWxsfXZhciBo
PTNEdGhpPQpzLnVybHMsaT0zRHRoaXMubW9kZWwuZ2V0KCJtZXRhX2ZpbGVzIik7aWYoXy5pc0Vt
cHR5KGkpKXtyZXR1cm4gJChbJzxhIGhyZWY9Cj0zRCInK2guZG93bmxvYWQrJyIgdGl0bGU9M0Qi
JytkKCJEb3dubG9hZCIpKyciICcsJ2NsYXNzPTNEImljb24tYnRuIGRhdGFzZT0KdC1kb3dubG9h
ZC1idG4iPicsJzxzcGFuIGNsYXNzPTNEImZhIGZhLWZsb3BweS1vIj48L3NwYW4+JywiPC9hPiJd
LmpvaW4oIiIpPQopfXZhciBqPTNEImRhdGFzZXQtIit0aGlzLm1vZGVsLmdldCgiaWQiKSsiLXBv
cHVwIixnPTNEWyc8ZGl2IHBvcHVwbWVudT0zRCI9CicraisnIj4nLCc8YSBocmVmPTNEIicraC5k
b3dubG9hZCsnIj4nLGQoIkRvd25sb2FkIERhdGFzZXQiKSwiPC9hPiIsIjxhPiIrZD0KKCJBZGRp
dGlvbmFsIEZpbGVzIikrIjwvYT4iLF8ubWFwKGksZnVuY3Rpb24oayl7cmV0dXJuWyc8YSBjbGFz
cz0zRCJhY3Rpb24tPQpidXR0b24iIGhyZWY9M0QiJyxoLm1ldGFfZG93bmxvYWQray5maWxlX3R5
cGUsJyI+JyxkKCJEb3dubG9hZCIpLCIgIixrLmZpbGU9Cl90eXBlLCI8L2E+Il0uam9pbigiIil9
KS5qb2luKCJcbiIpLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEImljb24tYnRuLWdyb3VwIj0KPics
JzxhIGhyZWY9M0QiJytoLmRvd25sb2FkKyciIHRpdGxlPTNEIicrZCgiRG93bmxvYWQiKSsnIiAn
LCdjbGFzcz0zRCJpY29uPQotYnRuIGRhdGFzZXQtZG93bmxvYWQtYnRuIj4nLCc8c3BhbiBjbGFz
cz0zRCJmYSBmYS1mbG9wcHktbyI+PC9zcGFuPicsJzwvYT49CjxhIGNsYXNzPTNEImljb24tYnRu
IHBvcHVwIiBpZD0zRCInK2orJyI+JywnPHNwYW4gY2xhc3M9M0QiZmEgZmEtY2FyZXQtZG93bj0K
Ij48L3NwYW4+JywiPC9hPiIsIjwvZGl2PiJdLmpvaW4oIlxuIik7cmV0dXJuICQoZyl9LF9yZW5k
ZXJfc2hvd1BhcmFtc0J1dHRvPQpuOmZ1bmN0aW9uKCl7cmV0dXJuIGZhSWNvbkJ1dHRvbih7dGl0
bGU6ZCgiVmlldyBkZXRhaWxzIiksY2xhc3NlczoiZGF0YXNldC09CnBhcmFtcy1idG4iLGhyZWY6
dGhpcy51cmxzLnNob3dfcGFyYW1zLHRhcmdldDp0aGlzLmxpbmtUYXJnZXQsZmFJY29uOiJmYS1p
bj0KZm8tY2lyY2xlIn0pfSxfcmVuZGVyX2JvZHk6ZnVuY3Rpb24oKXt2YXIgaD0zRCQoJzxkaXY+
RXJyb3I6IHVua25vd24gZGF0YXNlPQp0IHN0YXRlICInK3RoaXMubW9kZWwuZ2V0KCJzdGF0ZSIp
KyciLjwvZGl2PicpLGc9M0R0aGlzWyJfcmVuZGVyX2JvZHlfIit0aGk9CnMubW9kZWwuZ2V0KCJz
dGF0ZSIpXTtpZihfLmlzRnVuY3Rpb24oZykpe2g9M0RnLmNhbGwodGhpcyl9dGhpcy5fc2V0VXBC
ZWhhdj0KaW9ycyhoKTtpZih0aGlzLmV4cGFuZGVkKXtoLnNob3coKX1yZXR1cm4gaH0sX3JlbmRl
cl9zdGF0ZUJvZHlIZWxwZXI6ZnVuY3RpPQpvbihnLGope2o9M0RqfHxbXTt2YXIgaD0zRHRoaXMs
aT0zRCQoYy50ZW1wbGF0ZXMuYm9keShfLmV4dGVuZCh0aGlzLm1vZGVsLnQ9Cm9KU09OKCkse2Jv
ZHk6Z30pKSk7aS5maW5kKCIuZGF0YXNldC1hY3Rpb25zIC5sZWZ0IikuYXBwZW5kKF8ubWFwKGos
ZnVuY3Rpbz0KbihrKXtyZXR1cm4gay5jYWxsKGgpfSkpO3JldHVybiBpfSxfcmVuZGVyX2JvZHlf
bmV3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuPQpfcmVuZGVyX3N0YXRlQm9keUhlbHBlcigiPGRp
dj4iK2QoIlRoaXMgaXMgYSBuZXcgZGF0YXNldCBhbmQgbm90IGFsbCBvZiBpdHM9CiBkYXRhIGFy
ZSBhdmFpbGFibGUgeWV0IikrIjwvZGl2PiIsdGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRv
blJlbmRlcmVycz0KKX0sX3JlbmRlcl9ib2R5X25vUGVybWlzc2lvbjpmdW5jdGlvbigpe3JldHVy
biB0aGlzLl9yZW5kZXJfc3RhdGVCb2R5SGVscGVyPQooIjxkaXY+IitkKCJZb3UgZG8gbm90IGhh
dmUgcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgZGF0YXNldCIpKyI8L2Rpdj4iKX0sX3I9CmVuZGVy
X2JvZHlfZGlzY2FyZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcl9zdGF0ZUJvZHlI
ZWxwZXIoIjxkaXY+Ij0KK2QoIlRoZSBqb2IgY3JlYXRpbmcgdGhpcyBkYXRhc2V0IHdhcyBjYW5j
ZWxsZWQgYmVmb3JlIGNvbXBsZXRpb24iKSsiPC9kaXY+PQoiLHRoaXMuZGVmYXVsdFByaW1hcnlB
Y3Rpb25CdXR0b25SZW5kZXJlcnMpfSxfcmVuZGVyX2JvZHlfcXVldWVkOmZ1bmN0aW9uKCk9Cnty
ZXR1cm4gdGhpcy5fcmVuZGVyX3N0YXRlQm9keUhlbHBlcigiPGRpdj4iK2QoIlRoaXMgam9iIGlz
IHdhaXRpbmcgdG8gcnVuIj0KKSsiPC9kaXY+Iix0aGlzLmRlZmF1bHRQcmltYXJ5QWN0aW9uQnV0
dG9uUmVuZGVyZXJzKX0sX3JlbmRlcl9ib2R5X3VwbG9hZDpmPQp1bmN0aW9uKCl7cmV0dXJuIHRo
aXMuX3JlbmRlcl9zdGF0ZUJvZHlIZWxwZXIoIjxkaXY+IitkKCJUaGlzIGRhdGFzZXQgaXMgY3U9
CnJyZW50bHkgdXBsb2FkaW5nIikrIjwvZGl2PiIpfSxfcmVuZGVyX2JvZHlfc2V0dGluZ19tZXRh
ZGF0YTpmdW5jdGlvbigpe3JldD0KdXJuIHRoaXMuX3JlbmRlcl9zdGF0ZUJvZHlIZWxwZXIoIjxk
aXY+IitkKCJNZXRhZGF0YSBpcyBiZWluZyBhdXRvLWRldGVjdGVkPQoiKSsiPC9kaXY+Iil9LF9y
ZW5kZXJfYm9keV9ydW5uaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcl9zdGF0ZUJv
ZHk9CkhlbHBlcigiPGRpdj4iK2QoIlRoaXMgam9iIGlzIGN1cnJlbnRseSBydW5uaW5nIikrIjwv
ZGl2PiIsdGhpcy5kZWZhdWx0UHJpbT0KYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJzKX0sX3JlbmRl
cl9ib2R5X3BhdXNlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kPQplcl9zdGF0ZUJvZHlI
ZWxwZXIoIjxkaXY+IitkKCdUaGlzIGpvYiBpcyBwYXVzZWQuIFVzZSB0aGUgIlJlc3VtZSBQYXVz
ZWQgSm89CmJzIiBpbiB0aGUgaGlzdG9yeSBtZW51IHRvIHJlc3VtZScpKyI8L2Rpdj4iLHRoaXMu
ZGVmYXVsdFByaW1hcnlBY3Rpb25CdXR0bz0KblJlbmRlcmVycyl9LF9yZW5kZXJfYm9keV9lcnJv
cjpmdW5jdGlvbigpe3ZhciBnPTNEWyc8c3BhbiBjbGFzcz0zRCJoZWxwLXRlPQp4dCI+JyxkKCJB
biBlcnJvciBvY2N1cnJlZCB3aXRoIHRoaXMgZGF0YXNldCIpLCI6PC9zcGFuPiIsJzxkaXYgY2xh
c3M9M0Qiam89CmItZXJyb3ItdGV4dCI+JywkLnRyaW0odGhpcy5tb2RlbC5nZXQoIm1pc2NfaW5m
byIpKSwiPC9kaXY+Il0uam9pbigiIik7aWYoIT0KdGhpcy5tb2RlbC5nZXQoInB1cmdlZCIpKXtn
PTNEIjxkaXY+Iit0aGlzLm1vZGVsLmdldCgibWlzY19ibHVyYiIpKyI8L2Rpdj4iPQorZ31yZXR1
cm4gdGhpcy5fcmVuZGVyX3N0YXRlQm9keUhlbHBlcihnLFt0aGlzLl9yZW5kZXJfZG93bmxvYWRC
dXR0b25dLmNvbmM9CmF0KHRoaXMuZGVmYXVsdFByaW1hcnlBY3Rpb25CdXR0b25SZW5kZXJlcnMp
KX0sX3JlbmRlcl9ib2R5X2VtcHR5OmZ1bmN0aW9uKD0KKXtyZXR1cm4gdGhpcy5fcmVuZGVyX3N0
YXRlQm9keUhlbHBlcigiPGRpdj4iK2QoIk5vIGRhdGEiKSsiOiA8aT4iK3RoaXMubW9kPQplbC5n
ZXQoIm1pc2NfYmx1cmIiKSsiPC9pPjwvZGl2PiIsdGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1
dHRvblJlbmRlcmVycyk9Cn0sX3JlbmRlcl9ib2R5X2ZhaWxlZF9tZXRhZGF0YTpmdW5jdGlvbigp
e3ZhciBnPTNEJCgnPGRpdiBjbGFzcz0zRCJ3YXJuaW5nbT0KZXNzYWdlc21hbGwiPjwvZGl2Picp
LmFwcGVuZCgkKCI8c3Ryb25nLz4iKS50ZXh0KGQoIkFuIGVycm9yIG9jY3VycmVkIHNldHRpPQpu
ZyB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgZGF0YXNldCIpKSksaD0zRHRoaXMuX3JlbmRlcl9ib2R5
X29rKCk7aC5wcmVwZW5kKGc9Cik7cmV0dXJuIGh9LF9yZW5kZXJfYm9keV9vazpmdW5jdGlvbigp
e3ZhciBnPTNEdGhpcyxpPTNEJChjLnRlbXBsYXRlcy5ib2R5KD0KdGhpcy5tb2RlbC50b0pTT04o
KSkpLGg9M0RbdGhpcy5fcmVuZGVyX2Rvd25sb2FkQnV0dG9uXS5jb25jYXQodGhpcy5kZWZhdWx0
PQpQcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJzKTtpLmZpbmQoIi5kYXRhc2V0LWFjdGlvbnMg
LmxlZnQiKS5hcHBlbmQoXy5tYXA9CihoLGZ1bmN0aW9uKGope3JldHVybiBqLmNhbGwoZyl9KSk7
aWYodGhpcy5tb2RlbC5pc0RlbGV0ZWRPclB1cmdlZCgpKXtyZXR1cj0KbiBpfXJldHVybiBpfSxl
dmVudHM6eyJjbGljayAuZGF0YXNldC10aXRsZS1iYXIiOiJ0b2dnbGVCb2R5VmlzaWJpbGl0eSIs
ImtlPQp5ZG93biAuZGF0YXNldC10aXRsZS1iYXIiOiJ0b2dnbGVCb2R5VmlzaWJpbGl0eSIsImNs
aWNrIC5kYXRhc2V0LXNlbGVjdG9yIjo9CiJ0b2dnbGVTZWxlY3QifSx0b2dnbGVCb2R5VmlzaWJp
bGl0eTpmdW5jdGlvbihqLGgpe3ZhciBnPTNEMzIsaT0zRDEzO2lmKGomJj0KKGoudHlwZT0zRD0z
RD0zRCJrZXlkb3duIikmJiEoai5rZXlDb2RlPTNEPTNEPTNEZ3x8ai5rZXlDb2RlPTNEPTNEPTNE
aSkpe3JlPQp0dXJuIHRydWV9dmFyIGs9M0R0aGlzLiRlbC5maW5kKCIuZGF0YXNldC1ib2R5Iik7
aD0zRChoPTNEPTNEPTNEdW5kZWZpbmVkKT89Cighay5pcygiOnZpc2libGUiKSk6KGgpO2lmKGgp
e3RoaXMuZXhwYW5kQm9keSgpfWVsc2V7dGhpcy5jb2xsYXBzZUJvZHkoKX1yZT0KdHVybiBmYWxz
ZX0sZXhwYW5kQm9keTpmdW5jdGlvbigpe3ZhciBnPTNEdGhpcztmdW5jdGlvbiBoKCl7Zy4kZWwu
Y2hpbGRyZW4oPQoiLmRhdGFzZXQtYm9keSIpLnJlcGxhY2VXaXRoKGcuX3JlbmRlcl9ib2R5KCkp
O2cuJGVsLmNoaWxkcmVuKCIuZGF0YXNldC1ib2Q9CnkiKS5zbGlkZURvd24oZy5meFNwZWVkLGZ1
bmN0aW9uKCl7Zy5leHBhbmRlZD0zRHRydWU7Zy50cmlnZ2VyKCJib2R5LWV4cGFuZD0KZWQiLGcu
bW9kZWwuZ2V0KCJpZCIpKX0pfWlmKHRoaXMubW9kZWwuaW5SZWFkeVN0YXRlKCkmJiF0aGlzLm1v
ZGVsLmhhc0RldGFpPQpscygpKXt0aGlzLm1vZGVsLmZldGNoKHtzaWxlbnQ6dHJ1ZX0pLmFsd2F5
cyhmdW5jdGlvbihpKXtnLnVybHM9M0RnLm1vZGVsLnU9CnJscygpO2goKX0pfWVsc2V7aCgpfX0s
Y29sbGFwc2VCb2R5OmZ1bmN0aW9uKCl7dmFyIGc9M0R0aGlzO3RoaXMuJGVsLmNoaWxkcj0KZW4o
Ii5kYXRhc2V0LWJvZHkiKS5zbGlkZVVwKGcuZnhTcGVlZCxmdW5jdGlvbigpe2cuZXhwYW5kZWQ9
M0RmYWxzZTtnLnRyaWdnPQplcigiYm9keS1jb2xsYXBzZWQiLGcubW9kZWwuZ2V0KCJpZCIpKX0p
fSxzaG93U2VsZWN0b3I6ZnVuY3Rpb24oKXtpZih0aGlzLnM9CmVsZWN0ZWQpe3RoaXMuc2VsZWN0
KG51bGwsdHJ1ZSl9dGhpcy5zZWxlY3RhYmxlPTNEdHJ1ZTt0aGlzLnRyaWdnZXIoInNlbGVjdD0K
YWJsZSIsdHJ1ZSx0aGlzKTt0aGlzLiQoIi5kYXRhc2V0LXByaW1hcnktYWN0aW9ucyIpLmhpZGUo
KTt0aGlzLiQoIi5kYXRhc2V0PQotc2VsZWN0b3IiKS5zaG93KCl9LGhpZGVTZWxlY3RvcjpmdW5j
dGlvbigpe3RoaXMuc2VsZWN0YWJsZT0zRGZhbHNlO3RoaXMudHI9CmlnZ2VyKCJzZWxlY3RhYmxl
IixmYWxzZSx0aGlzKTt0aGlzLiQoIi5kYXRhc2V0LXNlbGVjdG9yIikuaGlkZSgpO3RoaXMuJCgi
Lj0KZGF0YXNldC1wcmltYXJ5LWFjdGlvbnMiKS5zaG93KCl9LHRvZ2dsZVNlbGVjdG9yOmZ1bmN0
aW9uKCl7aWYoIXRoaXMuJGVsLmZpPQpuZCgiLmRhdGFzZXQtc2VsZWN0b3IiKS5pcygiOnZpc2li
bGUiKSl7dGhpcy5zaG93U2VsZWN0b3IoKX1lbHNle3RoaXMuaGlkZVM9CmVsZWN0b3IoKX19LHNl
bGVjdDpmdW5jdGlvbihnKXt0aGlzLiRlbC5maW5kKCIuZGF0YXNldC1zZWxlY3RvciBzcGFuIiku
cmVtbz0KdmVDbGFzcygiZmEtc3F1YXJlLW8iKS5hZGRDbGFzcygiZmEtY2hlY2stc3F1YXJlLW8i
KTtpZighdGhpcy5zZWxlY3RlZCl7dGhpPQpzLnRyaWdnZXIoInNlbGVjdGVkIix0aGlzKTt0aGlz
LnNlbGVjdGVkPTNEdHJ1ZX1yZXR1cm4gZmFsc2V9LGRlc2VsZWN0OmZ1bmM9CnRpb24oZyl7dGhp
cy4kZWwuZmluZCgiLmRhdGFzZXQtc2VsZWN0b3Igc3BhbiIpLnJlbW92ZUNsYXNzKCJmYS1jaGVj
ay1zcXVhcj0KZS1vIikuYWRkQ2xhc3MoImZhLXNxdWFyZS1vIik7aWYodGhpcy5zZWxlY3RlZCl7
dGhpcy50cmlnZ2VyKCJkZS1zZWxlY3RlZCIsPQp0aGlzKTt0aGlzLnNlbGVjdGVkPTNEZmFsc2V9
cmV0dXJuIGZhbHNlfSx0b2dnbGVTZWxlY3Q6ZnVuY3Rpb24oZyl7aWYodGhpcy49CnNlbGVjdGVk
KXt0aGlzLmRlc2VsZWN0KGcpfWVsc2V7dGhpcy5zZWxlY3QoZyl9fSxkcmFnZ2FibGVPbjpmdW5j
dGlvbigpe3RoaT0Kcy5kcmFnZ2FibGU9M0R0cnVlO3RoaXMuZHJhZ1N0YXJ0SGFuZGxlcj0zRF8u
YmluZCh0aGlzLl9kcmFnU3RhcnRIYW5kbGVyLHRoPQppcyk7dGhpcy5kcmFnRW5kSGFuZGxlcj0z
RF8uYmluZCh0aGlzLl9kcmFnRW5kSGFuZGxlcix0aGlzKTt2YXIgZz0zRHRoaXMuJGU9CmwuZmlu
ZCgiLmRhdGFzZXQtdGl0bGUtYmFyIikuYXR0cigiZHJhZ2dhYmxlIix0cnVlKS5nZXQoMCk7Zy5h
ZGRFdmVudExpc3Rlbj0KZXIoImRyYWdzdGFydCIsdGhpcy5kcmFnU3RhcnRIYW5kbGVyLGZhbHNl
KTtnLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbmQiLHRoPQppcy5kcmFnRW5kSGFuZGxlcixmYWxz
ZSl9LGRyYWdnYWJsZU9mZjpmdW5jdGlvbigpe3RoaXMuZHJhZ2dhYmxlPTNEZmFsc2U7dmE9CnIg
Zz0zRHRoaXMuJGVsLmZpbmQoIi5kYXRhc2V0LXRpdGxlLWJhciIpLmF0dHIoImRyYWdnYWJsZSIs
ZmFsc2UpLmdldCgwKTtnLj0KcmVtb3ZlRXZlbnRMaXN0ZW5lcigiZHJhZ3N0YXJ0Iix0aGlzLmRy
YWdTdGFydEhhbmRsZXIsZmFsc2UpO2cucmVtb3ZlRXZlbnRMPQppc3RlbmVyKCJkcmFnZW5kIix0
aGlzLmRyYWdFbmRIYW5kbGVyLGZhbHNlKX0sdG9nZ2xlRHJhZ2dhYmxlOmZ1bmN0aW9uKCl7aWY9
Cih0aGlzLmRyYWdnYWJsZSl7dGhpcy5kcmFnZ2FibGVPZmYoKX1lbHNle3RoaXMuZHJhZ2dhYmxl
T24oKX19LF9kcmFnU3RhcnRIYT0KbmRsZXI6ZnVuY3Rpb24oZyl7dGhpcy50cmlnZ2VyKCJkcmFn
c3RhcnQiLHRoaXMpO2cuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93PQplZD0zRCJtb3ZlIjtnLmRh
dGFUcmFuc2Zlci5zZXREYXRhKCJ0ZXh0IixKU09OLnN0cmluZ2lmeSh0aGlzLm1vZGVsLnRvSlNP
Tig9CikpKTtyZXR1cm4gZmFsc2V9LF9kcmFnRW5kSGFuZGxlcjpmdW5jdGlvbihnKXt0aGlzLnRy
aWdnZXIoImRyYWdlbmQiLHRoaXMpOz0KcmV0dXJuIGZhbHNlfSxyZW1vdmU6ZnVuY3Rpb24oaCl7
dmFyIGc9M0R0aGlzO3RoaXMuJGVsLmZhZGVPdXQoZy5meFNwZWVkLGZ1PQpuY3Rpb24oKXtnLiRl
bC5yZW1vdmUoKTtnLm9mZigpO2lmKGgpe2goKX19KX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIg
Zz0zRCg9CnRoaXMubW9kZWwpPyh0aGlzLm1vZGVsKyIiKTooIihubyBtb2RlbCkiKTtyZXR1cm4i
SERBQmFzZVZpZXcoIitnKyIpIn19KTt2YT0KciBhPTNEWyc8ZGl2IGNsYXNzPTNEImRhdGFzZXQg
aGRhIj4nLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtd2FybmluZ3MiPicsIjwlPQogaWYoIGhkYS5l
cnJvciApeyAlPiIsJzxkaXYgY2xhc3M9M0QiZXJyb3JtZXNzYWdlc21hbGwiPicsZCgiVGhlcmUg
d2FzIGFuIGU9CnJyb3IgZ2V0dGluZyB0aGUgZGF0YSBmb3IgdGhpcyBkYXRhc2V0IiksIjo8JS0g
aGRhLmVycm9yICU+IiwiPC9kaXY+IiwiPCUgfT0KICU+IiwiPCUgaWYoIGhkYS5kZWxldGVkICl7
ICU+IiwiPCUgaWYoIGhkYS5wdXJnZWQgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhPQp0YXNldC1w
dXJnZWQtbXNnIHdhcm5pbmdtZXNzYWdlc21hbGwiPjxzdHJvbmc+JyxkKCJUaGlzIGRhdGFzZXQg
aGFzIGJlZW4gZGU9CmxldGVkIGFuZCByZW1vdmVkIGZyb20gZGlzay4iKSwiPC9zdHJvbmc+PC9k
aXY+IiwiPCUgfSBlbHNlIHsgJT4iLCc8ZGl2IGNsYT0Kc3M9M0QiZGF0YXNldC1kZWxldGVkLW1z
ZyB3YXJuaW5nbWVzc2FnZXNtYWxsIj48c3Ryb25nPicsZCgiVGhpcyBkYXRhc2V0IGhhPQpzIGJl
ZW4gZGVsZXRlZC4iKSwiPC9zdHJvbmc+PC9kaXY+IiwiPCUgfSAlPiIsIjwlIH0gJT4iLCI8JSBp
ZiggIWhkYS52aXNpYmw9CmUgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtaGlkZGVuLW1z
ZyB3YXJuaW5nbWVzc2FnZXNtYWxsIj48c3Ryb25nPicsZD0KKCJUaGlzIGRhdGFzZXQgaGFzIGJl
ZW4gaGlkZGVuLiIpLCI8L3N0cm9uZz48L2Rpdj4iLCI8JSB9ICU+IiwiPC9kaXY+IiwnPGRpPQp2
IGNsYXNzPTNEImRhdGFzZXQtc2VsZWN0b3IiPicsJzxzcGFuIGNsYXNzPTNEImZhIGZhLTJ4IGZh
LXNxdWFyZS1vIj48L3NwYW49Cj4nLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtcHJp
bWFyeS1hY3Rpb25zIj48L2Rpdj4nLCc8ZGl2IGNsYXNzPTNEIj0KZGF0YXNldC10aXRsZS1iYXIg
Y2xlYXIiIHRhYmluZGV4PTNEIjAiPicsJzxzcGFuIGNsYXNzPTNEImRhdGFzZXQtc3RhdGUtaWNv
PQpuIHN0YXRlLWljb24iPjwvc3Bhbj4nLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtdGl0bGUiPics
JzxzcGFuIGNsYXNzPTNEImhkYS09CmhpZCI+PCUtIGhkYS5oaWQgJT48L3NwYW4+ICcsJzxzcGFu
IGNsYXNzPTNEImRhdGFzZXQtbmFtZSI+PCUtIGhkYS5uYW1lICU+PD0KL3NwYW4+JywiPC9kaXY+
IiwiPC9kaXY+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWJvZHkiPjwvZGl2PicsIjwvZGl2PiJd
LmpvPQppbigiIik7dmFyIGY9M0RbJzxkaXYgY2xhc3M9M0QiZGF0YXNldC1ib2R5Ij4nLCI8JSBp
ZiggaGRhLmJvZHkgKXsgJT4iLCc8ZGk9CnYgY2xhc3M9M0QiZGF0YXNldC1zdW1tYXJ5Ij4nLCI8
JT0zRCBoZGEuYm9keSAlPiIsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiZD0KYXRhc2V0LWFjdGlv
bnMgY2xlYXIiPicsJzxkaXYgY2xhc3M9M0QibGVmdCI+PC9kaXY+JywnPGRpdiBjbGFzcz0zRCJy
aWdodCI+PQo8L2Rpdj4nLCI8L2Rpdj4iLCI8JSB9IGVsc2UgeyAlPiIsJzxkaXYgY2xhc3M9M0Qi
ZGF0YXNldC1zdW1tYXJ5Ij4nLCI8JSBpZig9CiBoZGEubWlzY19ibHVyYiApeyAlPiIsJzxkaXYg
Y2xhc3M9M0QiZGF0YXNldC1ibHVyYiI+JywnPHNwYW4gY2xhc3M9M0QidmFsdT0KZSI+PCUtIGhk
YS5taXNjX2JsdXJiICU+PC9zcGFuPicsIjwvZGl2PiIsIjwlIH0gJT4iLCI8JSBpZiggaGRhLmRh
dGFfdHlwZSApPQp7ICU+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWRhdGF0eXBlIj4nLCc8bGFi
ZWwgY2xhc3M9M0QicHJvbXB0Ij4nLGQoImZvcm09CmF0IiksIjwvbGFiZWw+IiwnPHNwYW4gY2xh
c3M9M0QidmFsdWUiPjwlLSBoZGEuZGF0YV90eXBlICU+PC9zcGFuPicsIjwvZGl2Pj0KIiwiPCUg
fSAlPiIsIjwlIGlmKCBoZGEubWV0YWRhdGFfZGJrZXkgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRh
dGFzZXQtZGJrZXkiPQo+JywnPGxhYmVsIGNsYXNzPTNEInByb21wdCI+JyxkKCJkYXRhYmFzZSIp
LCI8L2xhYmVsPiIsJzxzcGFuIGNsYXNzPTNEInZhbHU9CmUiPicsIjwlLSBoZGEubWV0YWRhdGFf
ZGJrZXkgJT4iLCI8L3NwYW4+IiwiPC9kaXY+IiwiPCUgfSAlPiIsIjwlIGlmKCBoZGEubT0KaXNj
X2luZm8gKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtaW5mbyI+JywnPHNwYW4gY2xhc3M9
M0QidmFsdWUiPjwlLSBoPQpkYS5taXNjX2luZm8gJT48L3NwYW4+JywiPC9kaXY+IiwiPCUgfSAl
PiIsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiZGF0YXNldC09CmFjdGlvbnMgY2xlYXIiPicsJzxk
aXYgY2xhc3M9M0QibGVmdCI+PC9kaXY+JywnPGRpdiBjbGFzcz0zRCJyaWdodCI+PC9kaXY+Jz0K
LCI8L2Rpdj4iLCI8JSBpZiggIWhkYS5kZWxldGVkICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJ0YWdz
LWRpc3BsYXkiPjwvZGl2PicsPQonPGRpdiBjbGFzcz0zRCJhbm5vdGF0aW9uLWRpc3BsYXkiPjwv
ZGl2PicsJzxkaXYgY2xhc3M9M0QiZGF0YXNldC1kaXNwbGF5LWE9CnBwbGljYXRpb25zIj4nLCI8
JSBfLmVhY2goIGhkYS5kaXNwbGF5X2FwcHMsIGZ1bmN0aW9uKCBhcHAgKXsgJT4iLCc8ZGl2IGNs
YT0Kc3M9M0QiZGlzcGxheS1hcHBsaWNhdGlvbiI+JywnPHNwYW4gY2xhc3M9M0QiZGlzcGxheS1h
cHBsaWNhdGlvbi1sb2NhdGlvbiI+PQo8JS0gYXBwLmxhYmVsICU+PC9zcGFuPiAnLCc8c3BhbiBj
bGFzcz0zRCJkaXNwbGF5LWFwcGxpY2F0aW9uLWxpbmtzIj4nLCI8JSA9Cl8uZWFjaCggYXBwLmxp
bmtzLCBmdW5jdGlvbiggbGluayApeyAlPiIsJzxhIHRhcmdldD0zRCI8JT0zRCBsaW5rLnRhcmdl
dCAlPj0KIiBocmVmPTNEIjwlPTNEIGxpbmsuaHJlZiAlPiI+JywiPCUgcHJpbnQoIF9sKCBsaW5r
LnRleHQgKSApOyAlPiIsIjwvYT4gIiwiPQo8JSB9KTsgJT4iLCI8L3NwYW4+IiwiPC9kaXY+Iiwi
PCUgfSk7ICU+IiwiPCUgXy5lYWNoKCBoZGEuZGlzcGxheV90eXBlcywgZnU9Cm5jdGlvbiggYXBw
ICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJkaXNwbGF5LWFwcGxpY2F0aW9uIj4nLCc8c3BhbiBjbGFz
cz0zRCJkaT0Kc3BsYXktYXBwbGljYXRpb24tbG9jYXRpb24iPjwlLSBhcHAubGFiZWwgJT48L3Nw
YW4+ICcsJzxzcGFuIGNsYXNzPTNEImRpc3BsPQpheS1hcHBsaWNhdGlvbi1saW5rcyI+JywiPCUg
Xy5lYWNoKCBhcHAubGlua3MsIGZ1bmN0aW9uKCBsaW5rICl7ICU+IiwnPGEgdGE9CnJnZXQ9M0Qi
PCU9M0QgbGluay50YXJnZXQgJT4iIGhyZWY9M0QiPCU9M0QgbGluay5ocmVmICU+Ij4nLCI8JSBw
cmludCggX2woID0KbGluay50ZXh0ICkgKTsgJT4iLCI8L2E+ICIsIjwlIH0pOyAlPiIsIjwvc3Bh
bj4iLCI8L2Rpdj4iLCI8JSB9KTsgJT4iLCI8L2RpPQp2PiIsJzxkaXYgY2xhc3M9M0QiZGF0YXNl
dC1wZWVrIj4nLCI8JSBpZiggaGRhLnBlZWsgKXsgJT4iLCc8cHJlIGNsYXNzPTNEInA9CmVlayI+
PCU9M0QgaGRhLnBlZWsgJT48L3ByZT4nLCI8JSB9ICU+IiwiPC9kaXY+IiwiPCUgfSAlPiIsIjwl
IH0gJT4iLCI8L2Rpdj0KPiJdLmpvaW4oIiIpO2MudGVtcGxhdGVzPTNEe3NrZWxldG9uOmZ1bmN0
aW9uKGcpe3JldHVybiBfLnRlbXBsYXRlKGEsZyx7dmFyPQppYWJsZToiaGRhIn0pfSxib2R5OmZ1
bmN0aW9uKGcpe3JldHVybiBfLnRlbXBsYXRlKGYsZyx7dmFyaWFibGU6ImhkYSJ9KX19O3I9CmV0
dXJue0hEQUJhc2VWaWV3OmN9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoKZGlmZiAt
ciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRjYzBjMTkxNDdl
YWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZj
L2RhdGFzZXQvaGRhLWVkaXQuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9kYXRh
c2V0L2hkYS1lZGl0LmpzCisrKyBiL3N0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvZGF0YXNldC9o
ZGEtZWRpdC5qcwpAQCAtMSwxICsxLDEgQEAKLWRlZmluZShbIm12Yy9kYXRhc2V0L2hkYS1tb2Rl
bCIsIm12Yy9kYXRhc2V0L2hkYS1iYXNlIiwibXZjL3RhZ3MiLCJtdmMvYW5uPQpvdGF0aW9ucyJd
LGZ1bmN0aW9uKGYsYixhLGUpe3ZhciBnPTNEYi5IREFCYXNlVmlldy5leHRlbmQoe2luaXRpYWxp
emU6ZnVuY3Q9CmlvbihoKXtiLkhEQUJhc2VWaWV3LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwo
dGhpcyxoKTt0aGlzLmhhc1VzZXI9M0RoLmhhcz0KVXNlcjt0aGlzLmRlZmF1bHRQcmltYXJ5QWN0
aW9uQnV0dG9uUmVuZGVyZXJzPTNEW3RoaXMuX3JlbmRlcl9zaG93UGFyYW1zQnV0PQp0b24sdGhp
cy5fcmVuZGVyX3JlcnVuQnV0dG9uXTt0aGlzLnRhZ3NFZGl0b3JTaG93bj0zRGgudGFnc0VkaXRv
clNob3dufHxmYWw9CnNlO3RoaXMuYW5ub3RhdGlvbkVkaXRvclNob3duPTNEaC5hbm5vdGF0aW9u
RWRpdG9yU2hvd258fGZhbHNlfSxfcmVuZGVyX3RpdD0KbGVCdXR0b25zOmZ1bmN0aW9uKCl7cmV0
dXJuIGIuSERBQmFzZVZpZXcucHJvdG90eXBlLl9yZW5kZXJfdGl0bGVCdXR0b25zLmNhPQpsbCh0
aGlzKS5jb25jYXQoW3RoaXMuX3JlbmRlcl9lZGl0QnV0dG9uKCksdGhpcy5fcmVuZGVyX2RlbGV0
ZUJ1dHRvbigpXSl9LF89CnJlbmRlcl9lZGl0QnV0dG9uOmZ1bmN0aW9uKCl7aWYoKHRoaXMubW9k
ZWwuZ2V0KCJzdGF0ZSIpPTNEPTNEPTNEZi5IaXN0b3J5RD0KYXRhc2V0QXNzb2NpYXRpb24uU1RB
VEVTLkRJU0NBUkRFRCl8fCh0aGlzLm1vZGVsLmdldCgic3RhdGUiKT0zRD0zRD0zRGYuSGlzPQp0
b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRFUy5OT1RfVklFV0FCTEUpfHwoIXRoaXMubW9kZWwu
Z2V0KCJhY2Nlc3NpYmxlIik9Cikpe3JldHVybiBudWxsfXZhciBqPTNEdGhpcy5tb2RlbC5nZXQo
InB1cmdlZCIpLGg9M0R0aGlzLm1vZGVsLmdldCgiZGVsZXRlZD0KIiksaT0zRHt0aXRsZTpfbCgi
RWRpdCBhdHRyaWJ1dGVzIiksaHJlZjp0aGlzLnVybHMuZWRpdCx0YXJnZXQ6dGhpcy5saW5rVGFy
PQpnZXQsY2xhc3NlczoiZGF0YXNldC1lZGl0In07aWYoaHx8ail7aS5kaXNhYmxlZD0zRHRydWU7
aWYoail7aS50aXRsZT0zRF9sKCI9CkNhbm5vdCBlZGl0IGF0dHJpYnV0ZXMgb2YgZGF0YXNldHMg
cmVtb3ZlZCBmcm9tIGRpc2siKX1lbHNle2lmKGgpe2kudGl0bGU9Cj0zRF9sKCJVbmRlbGV0ZSBk
YXRhc2V0IHRvIGVkaXQgYXR0cmlidXRlcyIpfX19ZWxzZXtpZih0aGlzLm1vZGVsLmdldCgic3Rh
dD0KZSIpPTNEPTNEPTNEZi5IaXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRFUy5VUExPQUQp
e2kuZGlzYWJsZWQ9M0R0cnVlO2kuPQp0aXRsZT0zRF9sKCJUaGlzIGRhdGFzZXQgbXVzdCBmaW5p
c2ggdXBsb2FkaW5nIGJlZm9yZSBpdCBjYW4gYmUgZWRpdGVkIil9ZWw9CnNle2lmKHRoaXMubW9k
ZWwuZ2V0KCJzdGF0ZSIpPTNEPTNEPTNEZi5IaXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRF
Uy5ORT0KVyl7aS5kaXNhYmxlZD0zRHRydWU7aS50aXRsZT0zRF9sKCJUaGlzIGRhdGFzZXQgaXMg
bm90IHlldCBlZGl0YWJsZSIpfX19aS5mPQphSWNvbj0zRCJmYS1wZW5jaWwiO3JldHVybiBmYUlj
b25CdXR0b24oaSl9LF9yZW5kZXJfZGVsZXRlQnV0dG9uOmZ1bmN0aW9uKCk9CntpZigodGhpcy5t
b2RlbC5nZXQoInN0YXRlIik9M0Q9M0Q9M0RmLkhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb24uU1RB
VEVTLk5PVD0KX1ZJRVdBQkxFKXx8KCF0aGlzLm1vZGVsLmdldCgiYWNjZXNzaWJsZSIpKSl7cmV0
dXJuIG51bGx9dmFyIGg9M0R0aGlzLGk9M0R7PQp0aXRsZTpfbCgiRGVsZXRlIiksY2xhc3Nlczoi
ZGF0YXNldC1kZWxldGUiLG9uY2xpY2s6ZnVuY3Rpb24oKXtoLiRlbC5maW5kKCI9Ci5pY29uLWJ0
bi5kYXRhc2V0LWRlbGV0ZSIpLnRyaWdnZXIoIm1vdXNlb3V0Iik7aC5tb2RlbFsiZGVsZXRlIl0o
KX19O2lmKHRoaT0Kcy5tb2RlbC5nZXQoImRlbGV0ZWQiKXx8dGhpcy5tb2RlbC5nZXQoInB1cmdl
ZCIpKXtpPTNEe3RpdGxlOl9sKCJEYXRhc2V0IGlzPQogYWxyZWFkeSBkZWxldGVkIiksZGlzYWJs
ZWQ6dHJ1ZX19aS5mYUljb249M0QiZmEtdGltZXMiO3JldHVybiBmYUljb25CdXR0b249CihpKX0s
X3JlbmRlcl9lcnJCdXR0b246ZnVuY3Rpb24oKXtpZih0aGlzLm1vZGVsLmdldCgic3RhdGUiKSE9
M0Q9M0RmLkhpc3Rvcj0KeURhdGFzZXRBc3NvY2lhdGlvbi5TVEFURVMuRVJST1Ipe3JldHVybiBu
dWxsfXJldHVybiBmYUljb25CdXR0b24oe3RpdGxlOl9sPQooIlZpZXcgb3IgcmVwb3J0IHRoaXMg
ZXJyb3IiKSxocmVmOnRoaXMudXJscy5yZXBvcnRfZXJyb3IsY2xhc3NlczoiZGF0YXNldC09CnJl
cG9ydC1lcnJvci1idG4iLHRhcmdldDp0aGlzLmxpbmtUYXJnZXQsZmFJY29uOiJmYS1idWcifSl9
LF9yZW5kZXJfcmVydW5CdT0KdHRvbjpmdW5jdGlvbigpe3JldHVybiBmYUljb25CdXR0b24oe3Rp
dGxlOl9sKCJSdW4gdGhpcyBqb2IgYWdhaW4iKSxocmVmOnRoPQppcy51cmxzLnJlcnVuLGNsYXNz
ZXM6ImRhdGFzZXQtcmVydW4tYnRuIix0YXJnZXQ6dGhpcy5saW5rVGFyZ2V0LGZhSWNvbjoiZmE9
Ci1yZWZyZXNoIn0pfSxfcmVuZGVyX3Zpc3VhbGl6YXRpb25zQnV0dG9uOmZ1bmN0aW9uKCl7dmFy
IGg9M0R0aGlzLm1vZGVsLmdldD0KKCJ2aXN1YWxpemF0aW9ucyIpO2lmKCghdGhpcy5oYXNVc2Vy
KXx8KCF0aGlzLm1vZGVsLmhhc0RhdGEoKSl8fChfLmlzRW1wdHkoPQpoKSkpe3JldHVybiBudWxs
fWlmKF8uaXNPYmplY3QoaFswXSkpe3JldHVybiB0aGlzLl9yZW5kZXJfdmlzdWFsaXphdGlvbnNG
cmE9Cm1ld29ya0J1dHRvbihoKX1pZighdGhpcy51cmxzLnZpc3VhbGl6YXRpb24pe3JldHVybiBu
dWxsfXZhciBqPTNEdGhpcy5tb2RlbD0KLmdldCgiZGJrZXkiKSxuPTNEdGhpcy51cmxzLnZpc3Vh
bGl6YXRpb24saz0zRHt9LG89M0R7ZGF0YXNldF9pZDp0aGlzLm1vZGVsPQouZ2V0KCJpZCIpLGhk
YV9sZGRhOiJoZGEifTtpZihqKXtvLmRia2V5PTNEan12YXIgaT0zRGZhSWNvbkJ1dHRvbih7dGl0
bGU6X2w9CigiVmlzdWFsaXplIiksY2xhc3NlczoiZGF0YXNldC12aXN1YWxpemUtYnRuIixmYUlj
b246ImZhLWJhci1jaGFydC1vIn0pO2Z1bj0KY3Rpb24gbChwKXtpZihwPTNEPTNEPTNEInRyYWNr
c3RlciIpe3JldHVybiBjKG4sbyxqKX1yZXR1cm4gZnVuY3Rpb24oKXtHYWxhPQp4eS5mcmFtZS5h
ZGQoe3RpdGxlOiJWaXN1YWxpemF0aW9uIix0eXBlOiJ1cmwiLGNvbnRlbnQ6bisiLyIrcCsiPyIr
JC5wYXJhbSg9Cm8pfSl9fWZ1bmN0aW9uIG0ocCl7cmV0dXJuIHAuY2hhckF0KDApLnRvVXBwZXJD
YXNlKCkrcC5zbGljZSgxKX1pZihoLmxlbmd0aD0KPTNEPTNEPTNEMSl7aS5hdHRyKCJkYXRhLW9y
aWdpbmFsLXRpdGxlIixfbCgiVmlzdWFsaXplIGluICIpK19sKG0oaFswXSkpKTtpPQouY2xpY2so
bChoWzBdKSl9ZWxzZXtfLmVhY2goaCxmdW5jdGlvbihwKXtrW19sKG0ocCkpXT0zRGwocCl9KTtt
YWtlX3BvcHVwbWU9Cm51KGksayl9cmV0dXJuIGl9LF9yZW5kZXJfdmlzdWFsaXphdGlvbnNGcmFt
ZXdvcmtCdXR0b246ZnVuY3Rpb24oaCl7aWYoISh0aD0KaXMubW9kZWwuaGFzRGF0YSgpKXx8ISho
JiYhXy5pc0VtcHR5KGgpKSl7cmV0dXJuIG51bGx9dmFyIGo9M0RmYUljb25CdXR0b24oPQp7dGl0
bGU6X2woIlZpc3VhbGl6ZSIpLGNsYXNzZXM6ImRhdGFzZXQtdmlzdWFsaXplLWJ0biIsZmFJY29u
OiJmYS1iYXItY2hhcnQ9Ci1vIn0pO2lmKGgubGVuZ3RoPTNEPTNEPTNEMSl7dmFyIGk9M0RoWzBd
O2ouYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIsX2woIj0KVmlzdWFsaXplIGluICIpK2kuaHRt
bCk7ai5hdHRyKCJocmVmIixpLmhyZWYpfWVsc2V7dmFyIGs9M0RbXTtfLmVhY2goaCxmdW5jPQp0
aW9uKGwpe2wuZnVuYz0zRGZ1bmN0aW9uKG0pe2lmKEdhbGF4eS5mcmFtZSYmR2FsYXh5LmZyYW1l
LmFjdGl2ZSl7R2FsYXh5LmY9CnJhbWUuYWRkKHt0aXRsZToiVmlzdWFsaXphdGlvbiIsdHlwZToi
dXJsIixjb250ZW50OmwuaHJlZn0pO20ucHJldmVudERlZmF1bD0KdCgpO3JldHVybiBmYWxzZX1y
ZXR1cm4gdHJ1ZX07ay5wdXNoKGwpO3JldHVybiBmYWxzZX0pO1BvcHVwTWVudS5jcmVhdGUoaixr
PQopfXJldHVybiBqfSxfYnVpbGROZXdSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgaD0zRGIuSERBQmFz
ZVZpZXcucHJvdG90eXBlLl9idWk9CmxkTmV3UmVuZGVyLmNhbGwodGhpcyk7aC5maW5kKCIuZGF0
YXNldC1kZWxldGVkLW1zZyIpLmFwcGVuZChfbCgnIENsaWNrIDxhID0KaHJlZj0zRCJqYXZhc2Ny
aXB0OnZvaWQoMCk7IiBjbGFzcz0zRCJkYXRhc2V0LXVuZGVsZXRlIj5oZXJlPC9hPiB0byB1bmRl
bGV0PQplIGl0IG9yIDxhIGhyZWY9M0QiamF2YXNjcmlwdDp2b2lkKDApOyIgY2xhc3M9M0QiZGF0
YXNldC1wdXJnZSI+aGVyZTwvYT4gdG89CiBpbW1lZGlhdGVseSByZW1vdmUgaXQgZnJvbSBkaXNr
JykpO2guZmluZCgiLmRhdGFzZXQtaGlkZGVuLW1zZyIpLmFwcGVuZChfbD0KKCcgQ2xpY2sgPGEg
aHJlZj0zRCJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0zRCJkYXRhc2V0LXVuaGlkZSI+aGVy
ZTwvYT4gPQp0byB1bmhpZGUgaXQnKSk7cmV0dXJuIGh9LF9yZW5kZXJfYm9keV9mYWlsZWRfbWV0
YWRhdGE6ZnVuY3Rpb24oKXt2YXIgaT0zRCQ9CigiPGEvPiIpLmF0dHIoe2hyZWY6dGhpcy51cmxz
LmVkaXQsdGFyZ2V0OnRoaXMubGlua1RhcmdldH0pLnRleHQoX2woInNldCBpdD0KIG1hbnVhbGx5
IG9yIHJldHJ5IGF1dG8tZGV0ZWN0aW9uIikpLGg9M0QkKCI8c3Bhbi8+IikudGV4dCgiLiAiK19s
KCJZb3UgbWF5PQogYmUgYWJsZSB0byIpKyIgIikuYXBwZW5kKGkpLGo9M0RiLkhEQUJhc2VWaWV3
LnByb3RvdHlwZS5fcmVuZGVyX2JvZHlfZmFpbGU9CmRfbWV0YWRhdGEuY2FsbCh0aGlzKTtqLmZp
bmQoIi53YXJuaW5nbWVzc2FnZXNtYWxsIHN0cm9uZyIpLmFwcGVuZChoKTtyZXR1cj0KbiBqfSxf
cmVuZGVyX2JvZHlfZXJyb3I6ZnVuY3Rpb24oKXt2YXIgaD0zRGIuSERBQmFzZVZpZXcucHJvdG90
eXBlLl9yZW5kZXJfPQpib2R5X2Vycm9yLmNhbGwodGhpcyk7aC5maW5kKCIuZGF0YXNldC1hY3Rp
b25zIC5sZWZ0IikucHJlcGVuZCh0aGlzLl9yZW5kZXI9Cl9lcnJCdXR0b24oKSk7cmV0dXJuIGh9
LF9yZW5kZXJfYm9keV9vazpmdW5jdGlvbigpe3ZhciBoPTNEYi5IREFCYXNlVmlldy5wcj0Kb3Rv
dHlwZS5fcmVuZGVyX2JvZHlfb2suY2FsbCh0aGlzKTtpZih0aGlzLm1vZGVsLmlzRGVsZXRlZE9y
UHVyZ2VkKCkpe3JldHVyPQpuIGh9dGhpcy5tYWtlRGJrZXlFZGl0TGluayhoKTtpZih0aGlzLmhh
c1VzZXIpe2guZmluZCgiLmRhdGFzZXQtYWN0aW9ucyAubGU9CmZ0IikuYXBwZW5kKHRoaXMuX3Jl
bmRlcl92aXN1YWxpemF0aW9uc0J1dHRvbigpKTt0aGlzLl9yZW5kZXJUYWdzKGgpO3RoaXMuXz0K
cmVuZGVyQW5ub3RhdGlvbihoKX1yZXR1cm4gaH0sX3JlbmRlclRhZ3M6ZnVuY3Rpb24oaCl7dmFy
IGk9M0R0aGlzO3RoaXMudGFnPQpzRWRpdG9yPTNEbmV3IGEuVGFnc0VkaXRvcih7bW9kZWw6dGhp
cy5tb2RlbCxlbDpoLmZpbmQoIi50YWdzLWRpc3BsYXkiKSxvbnM9Cmhvd0ZpcnN0VGltZTpmdW5j
dGlvbigpe3RoaXMucmVuZGVyKCl9LG9uc2hvdzpmdW5jdGlvbigpe2kudGFnc0VkaXRvclNob3du
PQo9M0R0cnVlfSxvbmhpZGU6ZnVuY3Rpb24oKXtpLnRhZ3NFZGl0b3JTaG93bj0zRGZhbHNlfSwk
YWN0aXZhdG9yOmZhSWNvbkJ1dHQ9Cm9uKHt0aXRsZTpfbCgiRWRpdCBkYXRhc2V0IHRhZ3MiKSxj
bGFzc2VzOiJkYXRhc2V0LXRhZy1idG4iLGZhSWNvbjoiZmEtdGFncz0KIn0pLmFwcGVuZFRvKGgu
ZmluZCgiLmRhdGFzZXQtYWN0aW9ucyAucmlnaHQiKSl9KTtpZih0aGlzLnRhZ3NFZGl0b3JTaG93
bil7PQp0aGlzLnRhZ3NFZGl0b3IudG9nZ2xlKHRydWUpfX0sX3JlbmRlckFubm90YXRpb246ZnVu
Y3Rpb24oaCl7dmFyIGk9M0R0aGlzO3Q9Cmhpcy5hbm5vdGF0aW9uRWRpdG9yPTNEbmV3IGUuQW5u
b3RhdGlvbkVkaXRvcih7bW9kZWw6dGhpcy5tb2RlbCxlbDpoLmZpbmQoIj0KLmFubm90YXRpb24t
ZGlzcGxheSIpLG9uc2hvd0ZpcnN0VGltZTpmdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9LG9uc2hv
dzpmdW5jPQp0aW9uKCl7aS5hbm5vdGF0aW9uRWRpdG9yU2hvd249M0R0cnVlfSxvbmhpZGU6ZnVu
Y3Rpb24oKXtpLmFubm90YXRpb25FZGl0b3I9ClNob3duPTNEZmFsc2V9LCRhY3RpdmF0b3I6ZmFJ
Y29uQnV0dG9uKHt0aXRsZTpfbCgiRWRpdCBkYXRhc2V0IGFubm90YXRpb24iKT0KLGNsYXNzZXM6
ImRhdGFzZXQtYW5ub3RhdGUtYnRuIixmYUljb246ImZhLWNvbW1lbnQifSkuYXBwZW5kVG8oaC5m
aW5kKCIuZGF0PQphc2V0LWFjdGlvbnMgLnJpZ2h0IikpfSk7aWYodGhpcy5hbm5vdGF0aW9uRWRp
dG9yU2hvd24pe3RoaXMuYW5ub3RhdGlvbkVkaXQ9Cm9yLnRvZ2dsZSh0cnVlKX19LG1ha2VEYmtl
eUVkaXRMaW5rOmZ1bmN0aW9uKGkpe2lmKHRoaXMubW9kZWwuZ2V0KCJtZXRhZGF0YT0KX2Ria2V5
Iik9M0Q9M0Q9M0QiPyImJiF0aGlzLm1vZGVsLmlzRGVsZXRlZE9yUHVyZ2VkKCkpe3ZhciBoPTNE
JCgnPGEgY2xhc3M9Cj0zRCJ2YWx1ZSI+PzwvYT4nKS5hdHRyKCJocmVmIix0aGlzLnVybHMuZWRp
dCkuYXR0cigidGFyZ2V0Iix0aGlzLmxpbmtUYXJnZT0KdCk7aS5maW5kKCIuZGF0YXNldC1kYmtl
eSAudmFsdWUiKS5yZXBsYWNlV2l0aChoKX19LGV2ZW50czpfLmV4dGVuZChfLmNsb25lPQooYi5I
REFCYXNlVmlldy5wcm90b3R5cGUuZXZlbnRzKSx7ImNsaWNrIC5kYXRhc2V0LXVuZGVsZXRlIjpm
dW5jdGlvbihoKXt0aGk9CnMubW9kZWwudW5kZWxldGUoKTtyZXR1cm4gZmFsc2V9LCJjbGljayAu
ZGF0YXNldC11bmhpZGUiOmZ1bmN0aW9uKGgpe3RoaXMubT0Kb2RlbC51bmhpZGUoKTtyZXR1cm4g
ZmFsc2V9LCJjbGljayAuZGF0YXNldC1wdXJnZSI6ImNvbmZpcm1QdXJnZSJ9KSxjb25maXJtPQpQ
dXJnZTpmdW5jdGlvbiBkKGgpe3RoaXMubW9kZWwucHVyZ2UoKTtyZXR1cm4gZmFsc2V9LHRvU3Ry
aW5nOmZ1bmN0aW9uKCl7dmE9CnIgaD0zRCh0aGlzLm1vZGVsKT8odGhpcy5tb2RlbCsiIik6KCIo
bm8gbW9kZWwpIik7cmV0dXJuIkhEQVZpZXcoIitoKyIpIn19KT0KO2Z1bmN0aW9uIGMoaCxqLGkp
e3JldHVybiBmdW5jdGlvbigpe3ZhciBrPTNEe307aWYoaSl7a1siZi1kYmtleSJdPTNEaX0kLmFq
PQpheCh7dXJsOmgrIi9saXN0X3RyYWNrcz8iKyQucGFyYW0oayksZGF0YVR5cGU6Imh0bWwiLGVy
cm9yOmZ1bmN0aW9uKCl7YWxlcnQ9CigoIkNvdWxkIG5vdCBhZGQgdGhpcyBkYXRhc2V0IHRvIGJy
b3dzZXIiKSsiLiIpfSxzdWNjZXNzOmZ1bmN0aW9uKGwpe3ZhciBtPQo9M0R3aW5kb3cucGFyZW50
O20uR2FsYXh5Lm1vZGFsLnNob3coe3RpdGxlOiJWaWV3IERhdGEgaW4gYSBOZXcgb3IgU2F2ZWQg
Vmk9CnN1YWxpemF0aW9uIixidXR0b25zOntDYW5jZWw6ZnVuY3Rpb24oKXttLkdhbGF4eS5tb2Rh
bC5oaWRlKCl9LCJWaWV3IGluIHNhdj0KZWQgdmlzdWFsaXphdGlvbiI6ZnVuY3Rpb24oKXttLkdh
bGF4eS5tb2RhbC5zaG93KHt0aXRsZToiQWRkIERhdGEgdG8gU2F2ZWQgPQpWaXN1YWxpemF0aW9u
Iixib2R5OmwsYnV0dG9uczp7Q2FuY2VsOmZ1bmN0aW9uKCl7bS5HYWxheHkubW9kYWwuaGlkZSgp
fSwiQWQ9CmQgdG8gdmlzdWFsaXphdGlvbiI6ZnVuY3Rpb24oKXskKG0uZG9jdW1lbnQpLmZpbmQo
ImlucHV0W25hbWU9M0RpZF06Y2hlY2tlZD0KIikuZWFjaChmdW5jdGlvbigpe20uR2FsYXh5Lm1v
ZGFsLmhpZGUoKTt2YXIgbj0zRCQodGhpcykudmFsKCk7ai5pZD0zRG47bS5HPQphbGF4eS5mcmFt
ZS5hZGQoe3RpdGxlOiJUcmFja3N0ZXIiLHR5cGU6InVybCIsY29udGVudDpoKyIvdHJhY2tzdGVy
PyIrJC5wYXI9CmFtKGopfSl9KX19fSl9LCJWaWV3IGluIG5ldyB2aXN1YWxpemF0aW9uIjpmdW5j
dGlvbigpe20uR2FsYXh5Lm1vZGFsLmhpZGUoKT0KO3ZhciBuPTNEaCsiL3RyYWNrc3Rlcj8iKyQu
cGFyYW0oaik7bS5HYWxheHkuZnJhbWUuYWRkKHt0aXRsZToiVHJhY2tzdGVyIix0PQp5cGU6InVy
bCIsY29udGVudDpufSl9fX0pfX0pO3JldHVybiBmYWxzZX19cmV0dXJue0hEQUVkaXRWaWV3Omd9
fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGVmaW5lKFsibXZjL2RhdGFzZXQvaGRh
LW1vZGVsIiwibXZjL2RhdGFzZXQvaGRhLWJhc2UiLCJtdmMvdGFncyIsIm12Yy9hbm49Cm90YXRp
b25zIiwidXRpbHMvbG9jYWxpemF0aW9uIl0sZnVuY3Rpb24oZyxiLGEsZSxmKXt2YXIgaD0zRGIu
SERBQmFzZVZpZXcuZT0KeHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24oaSl7Yi5IREFCYXNlVmll
dy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsPQppKTt0aGlzLmhhc1VzZXI9M0RpLmhh
c1VzZXI7dGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVycz0zRFt0aGk9CnMu
X3JlbmRlcl9zaG93UGFyYW1zQnV0dG9uLHRoaXMuX3JlbmRlcl9yZXJ1bkJ1dHRvbl07dGhpcy50
YWdzRWRpdG9yU2hvd249Cj0zRGkudGFnc0VkaXRvclNob3dufHxmYWxzZTt0aGlzLmFubm90YXRp
b25FZGl0b3JTaG93bj0zRGkuYW5ub3RhdGlvbkVkaXRvcj0KU2hvd258fGZhbHNlfSxfcmVuZGVy
X3RpdGxlQnV0dG9uczpmdW5jdGlvbigpe3JldHVybiBiLkhEQUJhc2VWaWV3LnByb3RvdHlwPQpl
Ll9yZW5kZXJfdGl0bGVCdXR0b25zLmNhbGwodGhpcykuY29uY2F0KFt0aGlzLl9yZW5kZXJfZWRp
dEJ1dHRvbigpLHRoaXMuX3I9CmVuZGVyX2RlbGV0ZUJ1dHRvbigpXSl9LF9yZW5kZXJfZWRpdEJ1
dHRvbjpmdW5jdGlvbigpe2lmKCh0aGlzLm1vZGVsLmdldCgicz0KdGF0ZSIpPTNEPTNEPTNEZy5I
aXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRFUy5ESVNDQVJERUQpfHwodGhpcy5tb2RlbC5n
PQpldCgic3RhdGUiKT0zRD0zRD0zRGcuSGlzdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5TVEFURVMu
Tk9UX1ZJRVdBQkxFKXx8KCF0aGk9CnMubW9kZWwuZ2V0KCJhY2Nlc3NpYmxlIikpKXtyZXR1cm4g
bnVsbH12YXIgaz0zRHRoaXMubW9kZWwuZ2V0KCJwdXJnZWQiKSxpPQo9M0R0aGlzLm1vZGVsLmdl
dCgiZGVsZXRlZCIpLGo9M0R7dGl0bGU6ZigiRWRpdCBhdHRyaWJ1dGVzIiksaHJlZjp0aGlzLnVy
bHM9Ci5lZGl0LHRhcmdldDp0aGlzLmxpbmtUYXJnZXQsY2xhc3NlczoiZGF0YXNldC1lZGl0In07
aWYoaXx8ayl7ai5kaXNhYmxlZD0zRD0KdHJ1ZTtpZihrKXtqLnRpdGxlPTNEZigiQ2Fubm90IGVk
aXQgYXR0cmlidXRlcyBvZiBkYXRhc2V0cyByZW1vdmVkIGZyb20gZGlzPQprIil9ZWxzZXtpZihp
KXtqLnRpdGxlPTNEZigiVW5kZWxldGUgZGF0YXNldCB0byBlZGl0IGF0dHJpYnV0ZXMiKX19fWVs
c2V7aWY9Cih0aGlzLm1vZGVsLmdldCgic3RhdGUiKT0zRD0zRD0zRGcuSGlzdG9yeURhdGFzZXRB
c3NvY2lhdGlvbi5TVEFURVMuVVBMT0FEKT0Ke2ouZGlzYWJsZWQ9M0R0cnVlO2oudGl0bGU9M0Rm
KCJUaGlzIGRhdGFzZXQgbXVzdCBmaW5pc2ggdXBsb2FkaW5nIGJlZm9yZSBpPQp0IGNhbiBiZSBl
ZGl0ZWQiKX1lbHNle2lmKHRoaXMubW9kZWwuZ2V0KCJzdGF0ZSIpPTNEPTNEPTNEZy5IaXN0b3J5
RGF0YXNldEE9CnNzb2NpYXRpb24uU1RBVEVTLk5FVyl7ai5kaXNhYmxlZD0zRHRydWU7ai50aXRs
ZT0zRGYoIlRoaXMgZGF0YXNldCBpcyBub3QgeT0KZXQgZWRpdGFibGUiKX19fWouZmFJY29uPTNE
ImZhLXBlbmNpbCI7cmV0dXJuIGZhSWNvbkJ1dHRvbihqKX0sX3JlbmRlcl9kZWxlPQp0ZUJ1dHRv
bjpmdW5jdGlvbigpe2lmKCh0aGlzLm1vZGVsLmdldCgic3RhdGUiKT0zRD0zRD0zRGcuSGlzdG9y
eURhdGFzZXRBc3M9Cm9jaWF0aW9uLlNUQVRFUy5OT1RfVklFV0FCTEUpfHwoIXRoaXMubW9kZWwu
Z2V0KCJhY2Nlc3NpYmxlIikpKXtyZXR1cm4gbnVsbD0KfXZhciBpPTNEdGhpcyxqPTNEe3RpdGxl
OmYoIkRlbGV0ZSIpLGNsYXNzZXM6ImRhdGFzZXQtZGVsZXRlIixvbmNsaWNrOmZ1bmN0PQppb24o
KXtpLiRlbC5maW5kKCIuaWNvbi1idG4uZGF0YXNldC1kZWxldGUiKS50cmlnZ2VyKCJtb3VzZW91
dCIpO2kubW9kZWxbImQ9CmVsZXRlIl0oKX19O2lmKHRoaXMubW9kZWwuZ2V0KCJkZWxldGVkIil8
fHRoaXMubW9kZWwuZ2V0KCJwdXJnZWQiKSl7aj0zRHt0aT0KdGxlOmYoIkRhdGFzZXQgaXMgYWxy
ZWFkeSBkZWxldGVkIiksZGlzYWJsZWQ6dHJ1ZX19ai5mYUljb249M0QiZmEtdGltZXMiO3JlPQp0
dXJuIGZhSWNvbkJ1dHRvbihqKX0sX3JlbmRlcl9lcnJCdXR0b246ZnVuY3Rpb24oKXtpZih0aGlz
Lm1vZGVsLmdldCgic3RhdGU9CiIpIT0zRD0zRGcuSGlzdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5T
VEFURVMuRVJST1Ipe3JldHVybiBudWxsfXJldHVybiBmYUljbz0KbkJ1dHRvbih7dGl0bGU6Zigi
VmlldyBvciByZXBvcnQgdGhpcyBlcnJvciIpLGhyZWY6dGhpcy51cmxzLnJlcG9ydF9lcnJvcixj
PQpsYXNzZXM6ImRhdGFzZXQtcmVwb3J0LWVycm9yLWJ0biIsdGFyZ2V0OnRoaXMubGlua1Rhcmdl
dCxmYUljb246ImZhLWJ1ZyJ9KX09CixfcmVuZGVyX3JlcnVuQnV0dG9uOmZ1bmN0aW9uKCl7cmV0
dXJuIGZhSWNvbkJ1dHRvbih7dGl0bGU6ZigiUnVuIHRoaXMgam9iID0KYWdhaW4iKSxocmVmOnRo
aXMudXJscy5yZXJ1bixjbGFzc2VzOiJkYXRhc2V0LXJlcnVuLWJ0biIsdGFyZ2V0OnRoaXMubGlu
a1RhPQpyZ2V0LGZhSWNvbjoiZmEtcmVmcmVzaCJ9KX0sX3JlbmRlcl92aXN1YWxpemF0aW9uc0J1
dHRvbjpmdW5jdGlvbigpe3ZhciBpPQo9M0R0aGlzLm1vZGVsLmdldCgidmlzdWFsaXphdGlvbnMi
KTtpZigoIXRoaXMuaGFzVXNlcil8fCghdGhpcy5tb2RlbC5oYXNEYXQ9CmEoKSl8fChfLmlzRW1w
dHkoaSkpKXtyZXR1cm4gbnVsbH1pZihfLmlzT2JqZWN0KGlbMF0pKXtyZXR1cm4gdGhpcy5fcmVu
ZGVyXz0KdmlzdWFsaXphdGlvbnNGcmFtZXdvcmtCdXR0b24oaSl9aWYoIXRoaXMudXJscy52aXN1
YWxpemF0aW9uKXtyZXR1cm4gbnVsbH12PQphciBrPTNEdGhpcy5tb2RlbC5nZXQoImRia2V5Iiks
bz0zRHRoaXMudXJscy52aXN1YWxpemF0aW9uLGw9M0R7fSxwPTNEe2RhdGE9CnNldF9pZDp0aGlz
Lm1vZGVsLmdldCgiaWQiKSxoZGFfbGRkYToiaGRhIn07aWYoayl7cC5kYmtleT0zRGt9dmFyIGo9
M0RmYUljbz0KbkJ1dHRvbih7dGl0bGU6ZigiVmlzdWFsaXplIiksY2xhc3NlczoiZGF0YXNldC12
aXN1YWxpemUtYnRuIixmYUljb246ImZhLWJhPQpyLWNoYXJ0LW8ifSk7ZnVuY3Rpb24gbShxKXtp
ZihxPTNEPTNEPTNEInRyYWNrc3RlciIpe3JldHVybiBjKG8scCxrKX1yZXR1cm49CiBmdW5jdGlv
bigpe0dhbGF4eS5mcmFtZS5hZGQoe3RpdGxlOiJWaXN1YWxpemF0aW9uIix0eXBlOiJ1cmwiLGNv
bnRlbnQ6bysiLz0KIitxKyI/IiskLnBhcmFtKHApfSl9fWZ1bmN0aW9uIG4ocSl7cmV0dXJuIHEu
Y2hhckF0KDApLnRvVXBwZXJDYXNlKCkrcS5zbGljPQplKDEpfWlmKGkubGVuZ3RoPTNEPTNEPTNE
MSl7ai5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIixmKCJWaXN1YWxpemUgaW4gIik9CitmKG4o
aVswXSkpKTtqLmNsaWNrKG0oaVswXSkpfWVsc2V7Xy5lYWNoKGksZnVuY3Rpb24ocSl7bFtmKG4o
cSkpXT0zRG0ocSl9KT0KO21ha2VfcG9wdXBtZW51KGosbCl9cmV0dXJuIGp9LF9yZW5kZXJfdmlz
dWFsaXphdGlvbnNGcmFtZXdvcmtCdXR0b246ZnVuY3RpPQpvbihpKXtpZighKHRoaXMubW9kZWwu
aGFzRGF0YSgpKXx8IShpJiYhXy5pc0VtcHR5KGkpKSl7cmV0dXJuIG51bGx9dmFyIGs9M0Q9CmZh
SWNvbkJ1dHRvbih7dGl0bGU6ZigiVmlzdWFsaXplIiksY2xhc3NlczoiZGF0YXNldC12aXN1YWxp
emUtYnRuIixmYUljb246Ij0KZmEtYmFyLWNoYXJ0LW8ifSk7aWYoaS5sZW5ndGg9M0Q9M0Q9M0Qx
KXt2YXIgaj0zRGlbMF07ay5hdHRyKCJkYXRhLW9yaWdpbmFsPQotdGl0bGUiLGYoIlZpc3VhbGl6
ZSBpbiAiKStqLmh0bWwpO2suYXR0cigiaHJlZiIsai5ocmVmKX1lbHNle3ZhciBsPTNEW107Xy49
CmVhY2goaSxmdW5jdGlvbihtKXttLmZ1bmM9M0RmdW5jdGlvbihuKXtpZihHYWxheHkuZnJhbWUm
JkdhbGF4eS5mcmFtZS5hY3Rpdj0KZSl7R2FsYXh5LmZyYW1lLmFkZCh7dGl0bGU6IlZpc3VhbGl6
YXRpb24iLHR5cGU6InVybCIsY29udGVudDptLmhyZWZ9KTtuLnByPQpldmVudERlZmF1bHQoKTty
ZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9O2wucHVzaChtKTtyZXR1cm4gZmFsc2V9KTtQb3B1cE1l
bnU9Ci5jcmVhdGUoayxsKX1yZXR1cm4ga30sX2J1aWxkTmV3UmVuZGVyOmZ1bmN0aW9uKCl7dmFy
IGk9M0RiLkhEQUJhc2VWaWV3LnBybz0KdG90eXBlLl9idWlsZE5ld1JlbmRlci5jYWxsKHRoaXMp
O2kuZmluZCgiLmRhdGFzZXQtZGVsZXRlZC1tc2ciKS5hcHBlbmQoZignPQogQ2xpY2sgPGEgaHJl
Zj0zRCJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0zRCJkYXRhc2V0LXVuZGVsZXRlIj5oZXJl
PC9hPiA9CnRvIHVuZGVsZXRlIGl0IG9yIDxhIGhyZWY9M0QiamF2YXNjcmlwdDp2b2lkKDApOyIg
Y2xhc3M9M0QiZGF0YXNldC1wdXJnZSI+aD0KZXJlPC9hPiB0byBpbW1lZGlhdGVseSByZW1vdmUg
aXQgZnJvbSBkaXNrJykpO2kuZmluZCgiLmRhdGFzZXQtaGlkZGVuLW1zZyIpPQouYXBwZW5kKGYo
JyBDbGljayA8YSBocmVmPTNEImphdmFzY3JpcHQ6dm9pZCgwKTsiIGNsYXNzPTNEImRhdGFzZXQt
dW5oaWRlIj49CmhlcmU8L2E+IHRvIHVuaGlkZSBpdCcpKTtyZXR1cm4gaX0sX3JlbmRlcl9ib2R5
X2ZhaWxlZF9tZXRhZGF0YTpmdW5jdGlvbigpez0KdmFyIGo9M0QkKCI8YS8+IikuYXR0cih7aHJl
Zjp0aGlzLnVybHMuZWRpdCx0YXJnZXQ6dGhpcy5saW5rVGFyZ2V0fSkudGV4dChmPQooInNldCBp
dCBtYW51YWxseSBvciByZXRyeSBhdXRvLWRldGVjdGlvbiIpKSxpPTNEJCgiPHNwYW4vPiIpLnRl
eHQoIi4gIitmKCI9CllvdSBtYXkgYmUgYWJsZSB0byIpKyIgIikuYXBwZW5kKGopLGs9M0RiLkhE
QUJhc2VWaWV3LnByb3RvdHlwZS5fcmVuZGVyX2JvZD0KeV9mYWlsZWRfbWV0YWRhdGEuY2FsbCh0
aGlzKTtrLmZpbmQoIi53YXJuaW5nbWVzc2FnZXNtYWxsIHN0cm9uZyIpLmFwcGVuZChpPQopO3Jl
dHVybiBrfSxfcmVuZGVyX2JvZHlfZXJyb3I6ZnVuY3Rpb24oKXt2YXIgaT0zRGIuSERBQmFzZVZp
ZXcucHJvdG90eXBlLl89CnJlbmRlcl9ib2R5X2Vycm9yLmNhbGwodGhpcyk7aS5maW5kKCIuZGF0
YXNldC1hY3Rpb25zIC5sZWZ0IikucHJlcGVuZCh0aGlzLj0KX3JlbmRlcl9lcnJCdXR0b24oKSk7
cmV0dXJuIGl9LF9yZW5kZXJfYm9keV9vazpmdW5jdGlvbigpe3ZhciBpPTNEYi5IREFCYXNlPQpW
aWV3LnByb3RvdHlwZS5fcmVuZGVyX2JvZHlfb2suY2FsbCh0aGlzKTtpZih0aGlzLm1vZGVsLmlz
RGVsZXRlZE9yUHVyZ2VkKCk9Cil7cmV0dXJuIGl9dGhpcy5tYWtlRGJrZXlFZGl0TGluayhpKTtp
Zih0aGlzLmhhc1VzZXIpe2kuZmluZCgiLmRhdGFzZXQtYWN0aT0Kb25zIC5sZWZ0IikuYXBwZW5k
KHRoaXMuX3JlbmRlcl92aXN1YWxpemF0aW9uc0J1dHRvbigpKTt0aGlzLl9yZW5kZXJUYWdzKGkp
PQo7dGhpcy5fcmVuZGVyQW5ub3RhdGlvbihpKX1yZXR1cm4gaX0sX3JlbmRlclRhZ3M6ZnVuY3Rp
b24oaSl7dmFyIGo9M0R0aGlzO3Q9Cmhpcy50YWdzRWRpdG9yPTNEbmV3IGEuVGFnc0VkaXRvcih7
bW9kZWw6dGhpcy5tb2RlbCxlbDppLmZpbmQoIi50YWdzLWRpc3BsYT0KeSIpLG9uc2hvd0ZpcnN0
VGltZTpmdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9LG9uc2hvdzpmdW5jdGlvbigpe2oudGFnc0Vk
aXRvPQpyU2hvd249M0R0cnVlfSxvbmhpZGU6ZnVuY3Rpb24oKXtqLnRhZ3NFZGl0b3JTaG93bj0z
RGZhbHNlfSwkYWN0aXZhdG9yOmZhSWM9Cm9uQnV0dG9uKHt0aXRsZTpmKCJFZGl0IGRhdGFzZXQg
dGFncyIpLGNsYXNzZXM6ImRhdGFzZXQtdGFnLWJ0biIsZmFJY29uOiJmYT0KLXRhZ3MifSkuYXBw
ZW5kVG8oaS5maW5kKCIuZGF0YXNldC1hY3Rpb25zIC5yaWdodCIpKX0pO2lmKHRoaXMudGFnc0Vk
aXRvclNoPQpvd24pe3RoaXMudGFnc0VkaXRvci50b2dnbGUodHJ1ZSl9fSxfcmVuZGVyQW5ub3Rh
dGlvbjpmdW5jdGlvbihpKXt2YXIgaj0zRHQ9Cmhpczt0aGlzLmFubm90YXRpb25FZGl0b3I9M0Ru
ZXcgZS5Bbm5vdGF0aW9uRWRpdG9yKHttb2RlbDp0aGlzLm1vZGVsLGVsOmkuZj0KaW5kKCIuYW5u
b3RhdGlvbi1kaXNwbGF5Iiksb25zaG93Rmlyc3RUaW1lOmZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIo
KX0sb25zaG93PQo6ZnVuY3Rpb24oKXtqLmFubm90YXRpb25FZGl0b3JTaG93bj0zRHRydWV9LG9u
aGlkZTpmdW5jdGlvbigpe2ouYW5ub3RhdGlvbkU9CmRpdG9yU2hvd249M0RmYWxzZX0sJGFjdGl2
YXRvcjpmYUljb25CdXR0b24oe3RpdGxlOmYoIkVkaXQgZGF0YXNldCBhbm5vdGF0aT0Kb24iKSxj
bGFzc2VzOiJkYXRhc2V0LWFubm90YXRlLWJ0biIsZmFJY29uOiJmYS1jb21tZW50In0pLmFwcGVu
ZFRvKGkuZmluZCgiPQouZGF0YXNldC1hY3Rpb25zIC5yaWdodCIpKX0pO2lmKHRoaXMuYW5ub3Rh
dGlvbkVkaXRvclNob3duKXt0aGlzLmFubm90YXRpb249CkVkaXRvci50b2dnbGUodHJ1ZSl9fSxt
YWtlRGJrZXlFZGl0TGluazpmdW5jdGlvbihqKXtpZih0aGlzLm1vZGVsLmdldCgibWV0YT0KZGF0
YV9kYmtleSIpPTNEPTNEPTNEIj8iJiYhdGhpcy5tb2RlbC5pc0RlbGV0ZWRPclB1cmdlZCgpKXt2
YXIgaT0zRCQoJzxhIGNsPQphc3M9M0QidmFsdWUiPj88L2E+JykuYXR0cigiaHJlZiIsdGhpcy51
cmxzLmVkaXQpLmF0dHIoInRhcmdldCIsdGhpcy5saW5rVGE9CnJnZXQpO2ouZmluZCgiLmRhdGFz
ZXQtZGJrZXkgLnZhbHVlIikucmVwbGFjZVdpdGgoaSl9fSxldmVudHM6Xy5leHRlbmQoXy5jbD0K
b25lKGIuSERBQmFzZVZpZXcucHJvdG90eXBlLmV2ZW50cykseyJjbGljayAuZGF0YXNldC11bmRl
bGV0ZSI6ZnVuY3Rpb24oaSl7PQp0aGlzLm1vZGVsLnVuZGVsZXRlKCk7cmV0dXJuIGZhbHNlfSwi
Y2xpY2sgLmRhdGFzZXQtdW5oaWRlIjpmdW5jdGlvbihpKXt0aGk9CnMubW9kZWwudW5oaWRlKCk7
cmV0dXJuIGZhbHNlfSwiY2xpY2sgLmRhdGFzZXQtcHVyZ2UiOiJjb25maXJtUHVyZ2UifSksY29u
Zj0KaXJtUHVyZ2U6ZnVuY3Rpb24gZChpKXt0aGlzLm1vZGVsLnB1cmdlKCk7cmV0dXJuIGZhbHNl
fSx0b1N0cmluZzpmdW5jdGlvbigpPQp7dmFyIGk9M0QodGhpcy5tb2RlbCk/KHRoaXMubW9kZWwr
IiIpOigiKG5vIG1vZGVsKSIpO3JldHVybiJIREFWaWV3KCIraSsiKSI9Cn19KTtmdW5jdGlvbiBj
KGksayxqKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbD0zRHt9O2lmKGope2xbImYtZGJrZXkiXT0z
RGp9JD0KLmFqYXgoe3VybDppKyIvbGlzdF90cmFja3M/IiskLnBhcmFtKGwpLGRhdGFUeXBlOiJo
dG1sIixlcnJvcjpmdW5jdGlvbigpe2FsPQplcnQoKCJDb3VsZCBub3QgYWRkIHRoaXMgZGF0YXNl
dCB0byBicm93c2VyIikrIi4iKX0sc3VjY2VzczpmdW5jdGlvbihtKXt2YXI9CiBuPTNEd2luZG93
LnBhcmVudDtuLkdhbGF4eS5tb2RhbC5zaG93KHt0aXRsZToiVmlldyBEYXRhIGluIGEgTmV3IG9y
IFNhdmVkID0KVmlzdWFsaXphdGlvbiIsYnV0dG9uczp7Q2FuY2VsOmZ1bmN0aW9uKCl7bi5HYWxh
eHkubW9kYWwuaGlkZSgpfSwiVmlldyBpbiBzPQphdmVkIHZpc3VhbGl6YXRpb24iOmZ1bmN0aW9u
KCl7bi5HYWxheHkubW9kYWwuc2hvdyh7dGl0bGU6IkFkZCBEYXRhIHRvIFNhdmU9CmQgVmlzdWFs
aXphdGlvbiIsYm9keTptLGJ1dHRvbnM6e0NhbmNlbDpmdW5jdGlvbigpe24uR2FsYXh5Lm1vZGFs
LmhpZGUoKX0sIj0KQWRkIHRvIHZpc3VhbGl6YXRpb24iOmZ1bmN0aW9uKCl7JChuLmRvY3VtZW50
KS5maW5kKCJpbnB1dFtuYW1lPTNEaWRdOmNoZWNrPQplZCIpLmVhY2goZnVuY3Rpb24oKXtuLkdh
bGF4eS5tb2RhbC5oaWRlKCk7dmFyIG89M0QkKHRoaXMpLnZhbCgpO2suaWQ9M0RvO249Ci5HYWxh
eHkuZnJhbWUuYWRkKHt0aXRsZToiVHJhY2tzdGVyIix0eXBlOiJ1cmwiLGNvbnRlbnQ6aSsiL3Ry
YWNrc3Rlcj8iKyQucD0KYXJhbShrKX0pfSl9fX0pfSwiVmlldyBpbiBuZXcgdmlzdWFsaXphdGlv
biI6ZnVuY3Rpb24oKXtuLkdhbGF4eS5tb2RhbC5oaWRlPQooKTt2YXIgbz0zRGkrIi90cmFja3N0
ZXI/IiskLnBhcmFtKGspO24uR2FsYXh5LmZyYW1lLmFkZCh7dGl0bGU6IlRyYWNrc3RlciI9Cix0
eXBlOiJ1cmwiLGNvbnRlbnQ6b30pfX19KX19KTtyZXR1cm4gZmFsc2V9fXJldHVybntIREFFZGl0
VmlldzpofX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKCmRpZmYgLXIgODM0NmVjNGJh
YTM5OTJmNGRjMDE2MWYwZmM3OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdj
Nz0KMzllMDUxM2FkZGZlMDJjYjIgc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9kYXRhc2V0L2hk
YS1tb2RlbC5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2RhdGFzZXQvaGRhLW1v
ZGVsLmpzCisrKyBiL3N0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvZGF0YXNldC9oZGEtbW9kZWwu
anMKQEAgLTEsMSArMSwxIEBACi1kZWZpbmUoWyJtdmMvYmFzZS1tdmMiXSxmdW5jdGlvbihiKXt2
YXIgZT0zREJhY2tib25lLk1vZGVsLmV4dGVuZChiLkxvZ2dhYj0KbGVNaXhpbikuZXh0ZW5kKHtk
ZWZhdWx0czp7aGlzdG9yeV9pZDpudWxsLG1vZGVsX2NsYXNzOiJIaXN0b3J5RGF0YXNldEFzc29j
PQppYXRpb24iLGhpZDowLGlkOm51bGwsbmFtZToiKHVubmFtZWQgZGF0YXNldCkiLHN0YXRlOiJu
ZXciLGRlbGV0ZWQ6ZmFsc2Usdmk9CnNpYmxlOnRydWUsYWNjZXNzaWJsZTp0cnVlLHB1cmdlZDpm
YWxzZSxkYXRhX3R5cGU6IiIsZmlsZV9zaXplOjAsZmlsZV9leHQ6Ij0KIixtZXRhX2ZpbGVzOltd
LG1pc2NfYmx1cmI6IiIsbWlzY19pbmZvOiIiLHRhZ3M6W10sYW5ub3RhdGlvbjoiIn0sdXJsUm9v
dDpnPQphbGF4eV9jb25maWcucm9vdCsiYXBpL2hpc3Rvcmllcy8iLHVybDpmdW5jdGlvbigpe3Jl
dHVybiB0aGlzLnVybFJvb3QrdGhpcy49CmdldCgiaGlzdG9yeV9pZCIpKyIvY29udGVudHMvIit0
aGlzLmdldCgiaWQiKX0sdXJsczpmdW5jdGlvbigpe3ZhciBqPTNEdGhpcz0KLmdldCgiaWQiKTtp
Zighail7cmV0dXJue319dmFyIGk9M0R7cHVyZ2U6Z2FsYXh5X2NvbmZpZy5yb290KyJkYXRhc2V0
cy8iK2orPQoiL3B1cmdlX2FzeW5jIixkaXNwbGF5OmdhbGF4eV9jb25maWcucm9vdCsiZGF0YXNl
dHMvIitqKyIvZGlzcGxheS8/cHJldmlldz0KPTNEVHJ1ZSIsZWRpdDpnYWxheHlfY29uZmlnLnJv
b3QrImRhdGFzZXRzLyIraisiL2VkaXQiLGRvd25sb2FkOmdhbGF4eV9jb25mPQppZy5yb290KyJk
YXRhc2V0cy8iK2orIi9kaXNwbGF5P3RvX2V4dD0zRCIrdGhpcy5nZXQoImZpbGVfZXh0IikscmVw
b3J0X2Vycm89CnI6Z2FsYXh5X2NvbmZpZy5yb290KyJkYXRhc2V0L2Vycm9ycz9pZD0zRCIraixy
ZXJ1bjpnYWxheHlfY29uZmlnLnJvb3QrInRvbz0KbF9ydW5uZXIvcmVydW4/aWQ9M0QiK2osc2hv
d19wYXJhbXM6Z2FsYXh5X2NvbmZpZy5yb290KyJkYXRhc2V0cy8iK2orIi9zaG93PQpfcGFyYW1z
Iix2aXN1YWxpemF0aW9uOmdhbGF4eV9jb25maWcucm9vdCsidmlzdWFsaXphdGlvbiIsYW5ub3Rh
dGlvbjp7Z2V0Omc9CmFsYXh5X2NvbmZpZy5yb290KyJkYXRhc2V0L2dldF9hbm5vdGF0aW9uX2Fz
eW5jP2lkPTNEIitqLHNldDpnYWxheHlfY29uZmlnLj0Kcm9vdCsiZGF0YXNldC9hbm5vdGF0ZV9h
c3luYz9pZD0zRCIran0sbWV0YV9kb3dubG9hZDpnYWxheHlfY29uZmlnLnJvb3QrImRhPQp0YXNl
dC9nZXRfbWV0YWRhdGFfZmlsZT9oZGFfaWQ9M0QiK2orIiZtZXRhZGF0YV9uYW1lPTNEIn07cmV0
dXJuIGl9LGluaXRpYWw9Cml6ZTpmdW5jdGlvbihpKXt0aGlzLmxvZyh0aGlzKyIuaW5pdGlhbGl6
ZSIsdGhpcy5hdHRyaWJ1dGVzKTt0aGlzLmxvZygiXHRwYT0KcmVudCBoaXN0b3J5X2lkOiAiK3Ro
aXMuZ2V0KCJoaXN0b3J5X2lkIikpO2lmKCF0aGlzLmdldCgiYWNjZXNzaWJsZSIpKXt0aGlzPQou
c2V0KCJzdGF0ZSIsZS5TVEFURVMuTk9UX1ZJRVdBQkxFKX10aGlzLl9zZXRVcExpc3RlbmVycygp
fSxfc2V0VXBMaXN0ZW5lcnM9CjpmdW5jdGlvbigpe3RoaXMub24oImNoYW5nZTpzdGF0ZSIsZnVu
Y3Rpb24oaixpKXt0aGlzLmxvZyh0aGlzKyIgaGFzIGNoYW5nZT0KZCBzdGF0ZToiLGosaSk7aWYo
dGhpcy5pblJlYWR5U3RhdGUoKSl7dGhpcy50cmlnZ2VyKCJzdGF0ZTpyZWFkeSIsaixpLHRoaXMu
PQpwcmV2aW91cygic3RhdGUiKSl9fSl9LGlzRGVsZXRlZE9yUHVyZ2VkOmZ1bmN0aW9uKCl7cmV0
dXJuKHRoaXMuZ2V0KCJkZWxldGU9CmQiKXx8dGhpcy5nZXQoInB1cmdlZCIpKX0saXNWaXNpYmxl
OmZ1bmN0aW9uKGosayl7dmFyIGk9M0R0cnVlO2lmKCghaikmJih0aD0KaXMuZ2V0KCJkZWxldGVk
Iil8fHRoaXMuZ2V0KCJwdXJnZWQiKSkpe2k9M0RmYWxzZX1pZigoIWspJiYoIXRoaXMuZ2V0KCJ2
aXNpPQpibGUiKSkpe2k9M0RmYWxzZX1yZXR1cm4gaX0saGlkZGVuOmZ1bmN0aW9uKCl7cmV0dXJu
ICF0aGlzLmdldCgidmlzaWJsZSIpfSw9CmluUmVhZHlTdGF0ZTpmdW5jdGlvbigpe3ZhciBpPTNE
Xy5jb250YWlucyhlLlJFQURZX1NUQVRFUyx0aGlzLmdldCgic3RhdGUiKT0KKTtyZXR1cm4odGhp
cy5pc0RlbGV0ZWRPclB1cmdlZCgpfHxpKX0saGFzRGV0YWlsczpmdW5jdGlvbigpe3JldHVybiBf
Lmhhcyh0PQpoaXMuYXR0cmlidXRlcywiZ2Vub21lX2J1aWxkIil9LGhhc0RhdGE6ZnVuY3Rpb24o
KXtyZXR1cm4odGhpcy5nZXQoImZpbGVfc2k9CnplIik+MCl9LCJkZWxldGUiOmZ1bmN0aW9uIGQo
aSl7aWYodGhpcy5nZXQoImRlbGV0ZWQiKSl7cmV0dXJuIGpRdWVyeS53aGVuKD0KKX1yZXR1cm4g
dGhpcy5zYXZlKHtkZWxldGVkOnRydWV9LGkpfSx1bmRlbGV0ZTpmdW5jdGlvbiBhKGkpe2lmKCF0
aGlzLmdldCgiPQpkZWxldGVkIil8fHRoaXMuZ2V0KCJwdXJnZWQiKSl7cmV0dXJuIGpRdWVyeS53
aGVuKCl9cmV0dXJuIHRoaXMuc2F2ZSh7ZGVsZXQ9CmVkOmZhbHNlfSxpKX0saGlkZTpmdW5jdGlv
biBjKGkpe2lmKCF0aGlzLmdldCgidmlzaWJsZSIpKXtyZXR1cm4galF1ZXJ5LndoZT0KbigpfXJl
dHVybiB0aGlzLnNhdmUoe3Zpc2libGU6ZmFsc2V9LGkpfSx1bmhpZGU6ZnVuY3Rpb24gaChpKXtp
Zih0aGlzLmdldCgiPQp2aXNpYmxlIikpe3JldHVybiBqUXVlcnkud2hlbigpfXJldHVybiB0aGlz
LnNhdmUoe3Zpc2libGU6dHJ1ZX0saSl9LHB1cmdlOmY9CnVuY3Rpb24gZyhpKXtpZih0aGlzLmdl
dCgicHVyZ2VkIikpe3JldHVybiBqUXVlcnkud2hlbigpfWk9M0RpfHx7fTtpLnVybD0zRD0KZ2Fs
YXh5X2NvbmZpZy5yb290KyJkYXRhc2V0cy8iK3RoaXMuZ2V0KCJpZCIpKyIvcHVyZ2VfYXN5bmMi
O3ZhciBqPTNEdGhpcyxrPQo9M0RqUXVlcnkuYWpheChpKTtrLmRvbmUoZnVuY3Rpb24obixsLG0p
e2ouc2V0KHtkZWxldGVkOnRydWUscHVyZ2VkOnRydWV9KX09Cik7ay5mYWlsKGZ1bmN0aW9uKHAs
bCxvKXt2YXIgbT0zRF9sKCJVbmFibGUgdG8gcHVyZ2UgZGF0YXNldCIpO3ZhciBuPTNEKCJSZT0K
bW92YWwgb2YgZGF0YXNldHMgYnkgdXNlcnMgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBHYWxheHkg
aW5zdGFuY2UiKTtpZihwLnJlPQpzcG9uc2VKU09OJiZwLnJlc3BvbnNlSlNPTi5lcnJvcil7bT0z
RHAucmVzcG9uc2VKU09OLmVycm9yfWVsc2V7aWYocC5yZXNwb249CnNlVGV4dC5pbmRleE9mKG4p
IT0zRD0zRC0xKXttPTNEbn19cC5yZXNwb25zZVRleHQ9M0RtO2oudHJpZ2dlcigiZXJyb3IiLGos
cD0KLGksX2wobSkse2Vycm9yOm19KX0pO3JldHVybiBrfSxzZWFyY2hBdHRyaWJ1dGVzOlsibmFt
ZSIsImZpbGVfZXh0IiwiZ2Vub21lPQpfYnVpbGQiLCJtaXNjX2JsdXJiIiwibWlzY19pbmZvIiwi
YW5ub3RhdGlvbiIsInRhZ3MiXSxzZWFyY2hBbGlhc2VzOnt0aXRsZTo9CiJuYW1lIixmb3JtYXQ6
ImZpbGVfZXh0IixkYXRhYmFzZToiZ2Vub21lX2J1aWxkIixibHVyYjoibWlzY19ibHVyYiIsZGVz
Y3JpcD0KdGlvbjoibWlzY19ibHVyYiIsaW5mbzoibWlzY19pbmZvIix0YWc6InRhZ3MifSxzZWFy
Y2hBdHRyaWJ1dGU6ZnVuY3Rpb24oayxpPQope3ZhciBqPTNEdGhpcy5nZXQoayk7aWYoIWl8fChq
PTNEPTNEPTNEdW5kZWZpbmVkfHxqPTNEPTNEPTNEbnVsbCkpe3JldHVybiA9CmZhbHNlfWlmKF8u
aXNBcnJheShqKSl7cmV0dXJuIHRoaXMuX3NlYXJjaEFycmF5QXR0cmlidXRlKGosaSl9cmV0dXJu
KGoudG9TdD0KcmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihpLnRvTG93ZXJDYXNlKCkpIT0z
RD0zRC0xKX0sX3NlYXJjaEFycmF5QXR0cmliPQp1dGU6ZnVuY3Rpb24oaixpKXtpPTNEaS50b0xv
d2VyQ2FzZSgpO3JldHVybiBfLmFueShqLGZ1bmN0aW9uKGspe3JldHVybihrLnQ9Cm9TdHJpbmco
KS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoaS50b0xvd2VyQ2FzZSgpKSE9M0Q9M0QtMSl9KX0sc2Vh
cmNoOmZ1bmN0aT0Kb24oaSl7dmFyIGo9M0R0aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLnNlYXJj
aEF0dHJpYnV0ZXMsZnVuY3Rpb24oayl7cmV0dXJuPQogai5zZWFyY2hBdHRyaWJ1dGUoayxpKX0p
fSxtYXRjaGVzOmZ1bmN0aW9uKGope3ZhciBsPTNEIj0zRCIsaT0zRGouc3BsaXQobCk9CjtpZihp
Lmxlbmd0aD49M0QyKXt2YXIgaz0zRGlbMF07az0zRHRoaXMuc2VhcmNoQWxpYXNlc1trXXx8azty
ZXR1cm4gdGhpcy5zZT0KYXJjaEF0dHJpYnV0ZShrLGlbMV0pfXJldHVybiAhIXRoaXMuc2VhcmNo
KGopLmxlbmd0aH0sbWF0Y2hlc0FsbDpmdW5jdGlvbihqPQope3ZhciBpPTNEdGhpcztqPTNEai5t
YXRjaCgvKCIuKiJ8XHcqPTNEIi4qInxcUyopL2cpLmZpbHRlcihmdW5jdGlvbihrKXtyZXQ9CnVy
biAhIWt9KTtyZXR1cm4gXy5hbGwoaixmdW5jdGlvbihrKXtrPTNEay5yZXBsYWNlKC8iL2csIiIp
O3JldHVybiBpLm1hdGNoZT0KcyhrKX0pfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBpPTNEdGhp
cy5nZXQoImlkIil8fCIiO2lmKHRoaXMuZ2V0KCJuYW1lIikpPQp7aT0zRHRoaXMuZ2V0KCJoaWQi
KSsnIDoiJyt0aGlzLmdldCgibmFtZSIpKyciLCcraX1yZXR1cm4iSERBKCIraSsiKSJ9fSk7ZS49
ClNUQVRFUz0zRHtVUExPQUQ6InVwbG9hZCIsUVVFVUVEOiJxdWV1ZWQiLFJVTk5JTkc6InJ1bm5p
bmciLFNFVFRJTkdfTUVUQURBVD0KQToic2V0dGluZ19tZXRhZGF0YSIsTkVXOiJuZXciLEVNUFRZ
OiJlbXB0eSIsT0s6Im9rIixQQVVTRUQ6InBhdXNlZCIsRkFJTEVEPQpfTUVUQURBVEE6ImZhaWxl
ZF9tZXRhZGF0YSIsTk9UX1ZJRVdBQkxFOiJub1Blcm1pc3Npb24iLERJU0NBUkRFRDoiZGlzY2Fy
ZGU9CmQiLEVSUk9SOiJlcnJvciJ9O2UuUkVBRFlfU1RBVEVTPTNEW2UuU1RBVEVTLk9LLGUuU1RB
VEVTLkVNUFRZLGUuU1RBVEVTLlBBVT0KU0VELGUuU1RBVEVTLkZBSUxFRF9NRVRBREFUQSxlLlNU
QVRFUy5OT1RfVklFV0FCTEUsZS5TVEFURVMuRElTQ0FSREVELGUuU1RBPQpURVMuRVJST1JdO2Uu
Tk9UX1JFQURZX1NUQVRFUz0zRFtlLlNUQVRFUy5VUExPQUQsZS5TVEFURVMuUVVFVUVELGUuU1RB
VEVTLlI9ClVOTklORyxlLlNUQVRFUy5TRVRUSU5HX01FVEFEQVRBLGUuU1RBVEVTLk5FV107dmFy
IGY9M0RCYWNrYm9uZS5Db2xsZWN0aW9uLj0KZXh0ZW5kKGIuTG9nZ2FibGVNaXhpbikuZXh0ZW5k
KHttb2RlbDplLHVybFJvb3Q6Z2FsYXh5X2NvbmZpZy5yb290KyJhcGkvaGlzPQp0b3JpZXMiLHVy
bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVybFJvb3QrIi8iK3RoaXMuaGlzdG9yeUlkKyIvY29u
dGVudHMifSw9CmluaXRpYWxpemU6ZnVuY3Rpb24oaixpKXtpPTNEaXx8e307dGhpcy5oaXN0b3J5
SWQ9M0RpLmhpc3RvcnlJZH0saWRzOmZ1bmN0aT0Kb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rp
b24oaSl7cmV0dXJuIGkuaWR9KX0sbm90UmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gPQp0aGlzLmZp
bHRlcihmdW5jdGlvbihpKXtyZXR1cm4gIWkuaW5SZWFkeVN0YXRlKCl9KX0scnVubmluZzpmdW5j
dGlvbigpe3ZhciA9Cmk9M0RbXTt0aGlzLmVhY2goZnVuY3Rpb24oail7aWYoIWouaW5SZWFkeVN0
YXRlKCkpe2kucHVzaChqLmdldCgiaWQiKSl9fSk7cj0KZXR1cm4gaX0sZ2V0QnlIaWQ6ZnVuY3Rp
b24oaSl7cmV0dXJuIF8uZmlyc3QodGhpcy5maWx0ZXIoZnVuY3Rpb24oail7cmV0dXJuPQogai5n
ZXQoImhpZCIpPTNEPTNEPTNEaX0pKX0sZ2V0VmlzaWJsZTpmdW5jdGlvbihpLGwsayl7az0zRGt8
fFtdO3ZhciBqPTNEbmU9CncgZih0aGlzLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbS5pc1Zp
c2libGUoaSxsKX0pKTtfLmVhY2goayxmdW5jdGlvbihtKT0Ke2lmKCFfLmlzRnVuY3Rpb24obSkp
e3JldHVybn1qPTNEbmV3IGYoai5maWx0ZXIobSkpfSk7cmV0dXJuIGp9LGhhdmVEZXRhaWxzPQo6
ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbGwoZnVuY3Rpb24oaSl7cmV0dXJuIGkuaGFzRGV0YWls
cygpfSl9LGZldGNoQWxsRGU9CnRhaWxzOmZ1bmN0aW9uKGope2o9M0RqfHx7fTt2YXIgaT0zRHtk
ZXRhaWxzOiJhbGwifTtqLmRhdGE9M0Qoai5kYXRhKT8oXy5leD0KdGVuZChqLmRhdGEsaSkpOihp
KTtyZXR1cm4gdGhpcy5mZXRjaChqKX0sYWpheFF1ZXVlOmZ1bmN0aW9uKGwsayl7dmFyIGo9M0Rq
PQpRdWVyeS5EZWZlcnJlZCgpLGk9M0R0aGlzLmxlbmd0aCxuPTNEW107aWYoIWkpe2oucmVzb2x2
ZShbXSk7cmV0dXJuIGp9dmFyIG09Cj0zRHRoaXMuY2hhaW4oKS5yZXZlcnNlKCkubWFwKGZ1bmN0
aW9uKHAsbyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHE9M0RsLmNhbD0KbChwLGspO3EuZG9uZShm
dW5jdGlvbihyKXtqLm5vdGlmeSh7Y3VycjpvLHRvdGFsOmkscmVzcG9uc2U6cixtb2RlbDpwfSl9
KTtxPQouYWx3YXlzKGZ1bmN0aW9uKHIpe24ucHVzaChyKTtpZihtLmxlbmd0aCl7bS5zaGlmdCgp
KCl9ZWxzZXtqLnJlc29sdmUobil9fSk9Cn19KS52YWx1ZSgpO20uc2hpZnQoKSgpO3JldHVybiBq
fSxtYXRjaGVzOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmZpbHRlcihmdT0KbmN0aW9uKGope3Jl
dHVybiBqLm1hdGNoZXMoaSl9KX0sc2V0OmZ1bmN0aW9uKGssaSl7dmFyIGo9M0R0aGlzO2s9M0Rf
Lm1hcChrPQosZnVuY3Rpb24obSl7dmFyIG49M0RqLmdldChtLmlkKTtpZighbil7cmV0dXJuIG19
dmFyIGw9M0RuLnRvSlNPTigpO18uZXh0ZW49CmQobCxtKTtyZXR1cm4gbH0pO0JhY2tib25lLkNv
bGxlY3Rpb24ucHJvdG90eXBlLnNldC5jYWxsKHRoaXMsayxpKX0sdG9TdHJpbj0KZzpmdW5jdGlv
bigpe3JldHVybihbIkhEQUNvbGxlY3Rpb24oIixbdGhpcy5oaXN0b3J5SWQsdGhpcy5sZW5ndGhd
LmpvaW4oKSwiPQopIl0uam9pbigiIikpfX0pO3JldHVybntIaXN0b3J5RGF0YXNldEFzc29jaWF0
aW9uOmUsSERBQ29sbGVjdGlvbjpmfX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2Rl
ZmluZShbIm12Yy9iYXNlLW12YyIsInV0aWxzL2xvY2FsaXphdGlvbiJdLGZ1bmN0aW9uKGQsYil7
dmFyIGk9M0RCYWNrYm9uPQplLk1vZGVsLmV4dGVuZChkLkxvZ2dhYmxlTWl4aW4pLmV4dGVuZCh7
ZGVmYXVsdHM6e2hpc3RvcnlfaWQ6bnVsbCxtb2RlbF9jbGE9CnNzOiJIaXN0b3J5RGF0YXNldEFz
c29jaWF0aW9uIixoaWQ6MCxpZDpudWxsLG5hbWU6Iih1bm5hbWVkIGRhdGFzZXQpIixzdGF0ZT0K
OiJuZXciLGRlbGV0ZWQ6ZmFsc2UsdmlzaWJsZTp0cnVlLGFjY2Vzc2libGU6dHJ1ZSxwdXJnZWQ6
ZmFsc2UsZGF0YV90eXBlOiIiPQosZmlsZV9zaXplOjAsZmlsZV9leHQ6IiIsbWV0YV9maWxlczpb
XSxtaXNjX2JsdXJiOiIiLG1pc2NfaW5mbzoiIix0YWdzOltdLGE9Cm5ub3RhdGlvbjoiIn0sdXJs
Um9vdDpnYWxheHlfY29uZmlnLnJvb3QrImFwaS9oaXN0b3JpZXMvIix1cmw6ZnVuY3Rpb24oKXty
ZT0KdHVybiB0aGlzLnVybFJvb3QrdGhpcy5nZXQoImhpc3RvcnlfaWQiKSsiL2NvbnRlbnRzLyIr
dGhpcy5nZXQoImlkIil9LHVybHM6PQpmdW5jdGlvbigpe3ZhciBrPTNEdGhpcy5nZXQoImlkIik7
aWYoIWspe3JldHVybnt9fXZhciBqPTNEe3B1cmdlOmdhbGF4eV9jb249CmZpZy5yb290KyJkYXRh
c2V0cy8iK2srIi9wdXJnZV9hc3luYyIsZGlzcGxheTpnYWxheHlfY29uZmlnLnJvb3QrImRhdGFz
ZXRzLz0KIitrKyIvZGlzcGxheS8/cHJldmlldz0zRFRydWUiLGVkaXQ6Z2FsYXh5X2NvbmZpZy5y
b290KyJkYXRhc2V0cy8iK2srIi9lZGl0PQoiLGRvd25sb2FkOmdhbGF4eV9jb25maWcucm9vdCsi
ZGF0YXNldHMvIitrKyIvZGlzcGxheT90b19leHQ9M0QiK3RoaXMuZ2V0KCI9CmZpbGVfZXh0Iiks
cmVwb3J0X2Vycm9yOmdhbGF4eV9jb25maWcucm9vdCsiZGF0YXNldC9lcnJvcnM/aWQ9M0QiK2ss
cmVydW46Zz0KYWxheHlfY29uZmlnLnJvb3QrInRvb2xfcnVubmVyL3JlcnVuP2lkPTNEIitrLHNo
b3dfcGFyYW1zOmdhbGF4eV9jb25maWcucm9vPQp0KyJkYXRhc2V0cy8iK2srIi9zaG93X3BhcmFt
cyIsdmlzdWFsaXphdGlvbjpnYWxheHlfY29uZmlnLnJvb3QrInZpc3VhbGl6YXQ9CmlvbiIsYW5u
b3RhdGlvbjp7Z2V0OmdhbGF4eV9jb25maWcucm9vdCsiZGF0YXNldC9nZXRfYW5ub3RhdGlvbl9h
c3luYz9pZD0zRD0KIitrLHNldDpnYWxheHlfY29uZmlnLnJvb3QrImRhdGFzZXQvYW5ub3RhdGVf
YXN5bmM/aWQ9M0QiK2t9LG1ldGFfZG93bmxvYWQ6PQpnYWxheHlfY29uZmlnLnJvb3QrImRhdGFz
ZXQvZ2V0X21ldGFkYXRhX2ZpbGU/aGRhX2lkPTNEIitrKyImbWV0YWRhdGFfbmFtZT0KPTNEIn07
cmV0dXJuIGp9LGluaXRpYWxpemU6ZnVuY3Rpb24oail7dGhpcy5sb2codGhpcysiLmluaXRpYWxp
emUiLHRoaXMuYXR0PQpyaWJ1dGVzKTt0aGlzLmxvZygiXHRwYXJlbnQgaGlzdG9yeV9pZDogIit0
aGlzLmdldCgiaGlzdG9yeV9pZCIpKTtpZighdGhpcy49CmdldCgiYWNjZXNzaWJsZSIpKXt0aGlz
LnNldCgic3RhdGUiLGkuU1RBVEVTLk5PVF9WSUVXQUJMRSl9dGhpcy5fc2V0VXBMaXN0ZT0KbmVy
cygpfSxfc2V0VXBMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLm9uKCJjaGFuZ2U6c3RhdGUiLGZ1
bmN0aW9uKGssail7dGhpPQpzLmxvZyh0aGlzKyIgaGFzIGNoYW5nZWQgc3RhdGU6IixrLGopO2lm
KHRoaXMuaW5SZWFkeVN0YXRlKCkpe3RoaXMudHJpZ2dlcig9CiJzdGF0ZTpyZWFkeSIsayxqLHRo
aXMucHJldmlvdXMoInN0YXRlIikpfX0pfSxpc0RlbGV0ZWRPclB1cmdlZDpmdW5jdGlvbigpez0K
cmV0dXJuKHRoaXMuZ2V0KCJkZWxldGVkIil8fHRoaXMuZ2V0KCJwdXJnZWQiKSl9LGlzVmlzaWJs
ZTpmdW5jdGlvbihrLGwpe3ZhPQpyIGo9M0R0cnVlO2lmKCghaykmJih0aGlzLmdldCgiZGVsZXRl
ZCIpfHx0aGlzLmdldCgicHVyZ2VkIikpKXtqPTNEZmFsc2V9aWY9CigoIWwpJiYoIXRoaXMuZ2V0
KCJ2aXNpYmxlIikpKXtqPTNEZmFsc2V9cmV0dXJuIGp9LGhpZGRlbjpmdW5jdGlvbigpe3JldHVy
bj0KICF0aGlzLmdldCgidmlzaWJsZSIpfSxpblJlYWR5U3RhdGU6ZnVuY3Rpb24oKXt2YXIgaj0z
RF8uY29udGFpbnMoaS5SRUFEWV9TPQpUQVRFUyx0aGlzLmdldCgic3RhdGUiKSk7cmV0dXJuKHRo
aXMuaXNEZWxldGVkT3JQdXJnZWQoKXx8ail9LGhhc0RldGFpbHM6ZnU9Cm5jdGlvbigpe3JldHVy
biBfLmhhcyh0aGlzLmF0dHJpYnV0ZXMsImdlbm9tZV9idWlsZCIpfSxoYXNEYXRhOmZ1bmN0aW9u
KCl7cj0KZXR1cm4odGhpcy5nZXQoImZpbGVfc2l6ZSIpPjApfSwiZGVsZXRlIjpmdW5jdGlvbiBl
KGope2lmKHRoaXMuZ2V0KCJkZWxldGVkPQoiKSl7cmV0dXJuIGpRdWVyeS53aGVuKCl9cmV0dXJu
IHRoaXMuc2F2ZSh7ZGVsZXRlZDp0cnVlfSxqKX0sdW5kZWxldGU6ZnVuY3Q9CmlvbiBoKGope2lm
KCF0aGlzLmdldCgiZGVsZXRlZCIpfHx0aGlzLmdldCgicHVyZ2VkIikpe3JldHVybiBqUXVlcnku
d2hlbigpfT0KcmV0dXJuIHRoaXMuc2F2ZSh7ZGVsZXRlZDpmYWxzZX0sail9LGhpZGU6ZnVuY3Rp
b24gYyhqKXtpZighdGhpcy5nZXQoInZpc2liPQpsZSIpKXtyZXR1cm4galF1ZXJ5LndoZW4oKX1y
ZXR1cm4gdGhpcy5zYXZlKHt2aXNpYmxlOmZhbHNlfSxqKX0sdW5oaWRlOmZ1bmM9CnRpb24gZyhq
KXtpZih0aGlzLmdldCgidmlzaWJsZSIpKXtyZXR1cm4galF1ZXJ5LndoZW4oKX1yZXR1cm4gdGhp
cy5zYXZlKHt2aT0Kc2libGU6dHJ1ZX0sail9LHB1cmdlOmZ1bmN0aW9uIGYoail7aWYodGhpcy5n
ZXQoInB1cmdlZCIpKXtyZXR1cm4galF1ZXJ5LndoPQplbigpfWo9M0RqfHx7fTtqLnVybD0zRGdh
bGF4eV9jb25maWcucm9vdCsiZGF0YXNldHMvIit0aGlzLmdldCgiaWQiKSsiL3B1cmc9CmVfYXN5
bmMiO3ZhciBrPTNEdGhpcyxsPTNEalF1ZXJ5LmFqYXgoaik7bC5kb25lKGZ1bmN0aW9uKG8sbSxu
KXtrLnNldCh7ZGVsZT0KdGVkOnRydWUscHVyZ2VkOnRydWV9KX0pO2wuZmFpbChmdW5jdGlvbihx
LG0scCl7dmFyIG49M0RiKCJVbmFibGUgdG8gcHVyZ2UgPQpkYXRhc2V0Iik7dmFyIG89M0QoIlJl
bW92YWwgb2YgZGF0YXNldHMgYnkgdXNlcnMgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBHYWw9CmF4
eSBpbnN0YW5jZSIpO2lmKHEucmVzcG9uc2VKU09OJiZxLnJlc3BvbnNlSlNPTi5lcnJvcil7bj0z
RHEucmVzcG9uc2VKU09OLj0KZXJyb3J9ZWxzZXtpZihxLnJlc3BvbnNlVGV4dC5pbmRleE9mKG8p
IT0zRD0zRC0xKXtuPTNEb319cS5yZXNwb25zZVRleHQ9M0RuPQo7ay50cmlnZ2VyKCJlcnJvciIs
ayxxLGosYihuKSx7ZXJyb3I6bn0pfSk7cmV0dXJuIGx9LHNlYXJjaEF0dHJpYnV0ZXM6WyJuYW09
CmUiLCJmaWxlX2V4dCIsImdlbm9tZV9idWlsZCIsIm1pc2NfYmx1cmIiLCJtaXNjX2luZm8iLCJh
bm5vdGF0aW9uIiwidGFncyJdLD0Kc2VhcmNoQWxpYXNlczp7dGl0bGU6Im5hbWUiLGZvcm1hdDoi
ZmlsZV9leHQiLGRhdGFiYXNlOiJnZW5vbWVfYnVpbGQiLGJsdXJiPQo6Im1pc2NfYmx1cmIiLGRl
c2NyaXB0aW9uOiJtaXNjX2JsdXJiIixpbmZvOiJtaXNjX2luZm8iLHRhZzoidGFncyJ9LHNlYXJj
aEE9CnR0cmlidXRlOmZ1bmN0aW9uKGwsail7dmFyIGs9M0R0aGlzLmdldChsKTtpZighanx8KGs9
M0Q9M0Q9M0R1bmRlZmluZWR8fGs9Cj0zRD0zRD0zRG51bGwpKXtyZXR1cm4gZmFsc2V9aWYoXy5p
c0FycmF5KGspKXtyZXR1cm4gdGhpcy5fc2VhcmNoQXJyYXlBdHRyaT0KYnV0ZShrLGopfXJldHVy
bihrLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGoudG9Mb3dlckNhc2UoKSkhPTNE
PTNEPQotMSl9LF9zZWFyY2hBcnJheUF0dHJpYnV0ZTpmdW5jdGlvbihrLGope2o9M0RqLnRvTG93
ZXJDYXNlKCk7cmV0dXJuIF8uYW55KGs9CixmdW5jdGlvbihsKXtyZXR1cm4obC50b1N0cmluZygp
LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihqLnRvTG93ZXJDYXNlKCkpIT0zRD0KPTNELTEpfSl9LHNl
YXJjaDpmdW5jdGlvbihqKXt2YXIgaz0zRHRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMuc2VhcmNo
QXR0cmliPQp1dGVzLGZ1bmN0aW9uKGwpe3JldHVybiBrLnNlYXJjaEF0dHJpYnV0ZShsLGopfSl9
LG1hdGNoZXM6ZnVuY3Rpb24oayl7dmFyIG09Cj0zRCI9M0QiLGo9M0RrLnNwbGl0KG0pO2lmKGou
bGVuZ3RoPj0zRDIpe3ZhciBsPTNEalswXTtsPTNEdGhpcy5zZWFyY2hBbGlhcz0KZXNbbF18fGw7
cmV0dXJuIHRoaXMuc2VhcmNoQXR0cmlidXRlKGwsalsxXSl9cmV0dXJuICEhdGhpcy5zZWFyY2go
aykubGVuZ3RoPQp9LG1hdGNoZXNBbGw6ZnVuY3Rpb24oayl7dmFyIGo9M0R0aGlzO2s9M0RrLm1h
dGNoKC8oIi4qInxcdyo9M0QiLioifFxTKikvZyk9Ci5maWx0ZXIoZnVuY3Rpb24obCl7cmV0dXJu
ICEhbH0pO3JldHVybiBfLmFsbChrLGZ1bmN0aW9uKGwpe2w9M0RsLnJlcGxhY2UoLz0KIi9nLCIi
KTtyZXR1cm4gai5tYXRjaGVzKGwpfSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGo9M0R0aGlz
LmdldCgiaWQiKXx8PQoiIjtpZih0aGlzLmdldCgibmFtZSIpKXtqPTNEdGhpcy5nZXQoImhpZCIp
KycgOiInK3RoaXMuZ2V0KCJuYW1lIikrJyIsJytqfXI9CmV0dXJuIkhEQSgiK2orIikifX0pO2ku
U1RBVEVTPTNEe1VQTE9BRDoidXBsb2FkIixRVUVVRUQ6InF1ZXVlZCIsUlVOTklORzoicj0KdW5u
aW5nIixTRVRUSU5HX01FVEFEQVRBOiJzZXR0aW5nX21ldGFkYXRhIixORVc6Im5ldyIsRU1QVFk6
ImVtcHR5IixPSzoib2siPQosUEFVU0VEOiJwYXVzZWQiLEZBSUxFRF9NRVRBREFUQToiZmFpbGVk
X21ldGFkYXRhIixOT1RfVklFV0FCTEU6Im5vUGVybWlzc2k9Cm9uIixESVNDQVJERUQ6ImRpc2Nh
cmRlZCIsRVJST1I6ImVycm9yIn07aS5SRUFEWV9TVEFURVM9M0RbaS5TVEFURVMuT0ssaS5TVD0K
QVRFUy5FTVBUWSxpLlNUQVRFUy5QQVVTRUQsaS5TVEFURVMuRkFJTEVEX01FVEFEQVRBLGkuU1RB
VEVTLk5PVF9WSUVXQUJMRSxpPQouU1RBVEVTLkRJU0NBUkRFRCxpLlNUQVRFUy5FUlJPUl07aS5O
T1RfUkVBRFlfU1RBVEVTPTNEW2kuU1RBVEVTLlVQTE9BRCxpLlM9ClRBVEVTLlFVRVVFRCxpLlNU
QVRFUy5SVU5OSU5HLGkuU1RBVEVTLlNFVFRJTkdfTUVUQURBVEEsaS5TVEFURVMuTkVXXTt2YXIg
YT0KPTNEQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoZC5Mb2dnYWJsZU1peGluKS5leHRlbmQo
e21vZGVsOmksdXJsUm9vdDpnYWxhPQp4eV9jb25maWcucm9vdCsiYXBpL2hpc3RvcmllcyIsdXJs
OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXJsUm9vdCsiLyIrdGhpcy49Cmhpc3RvcnlJZCsiL2Nv
bnRlbnRzIn0saW5pdGlhbGl6ZTpmdW5jdGlvbihrLGope2o9M0RqfHx7fTt0aGlzLmhpc3RvcnlJ
ZD0zRD0Kai5oaXN0b3J5SWR9LGlkczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlv
bihqKXtyZXR1cm4gai5pZH0pfSxub3RSPQplYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmls
dGVyKGZ1bmN0aW9uKGope3JldHVybiAhai5pblJlYWR5U3RhdGUoKX0pfSw9CnJ1bm5pbmc6ZnVu
Y3Rpb24oKXt2YXIgaj0zRFtdO3RoaXMuZWFjaChmdW5jdGlvbihrKXtpZighay5pblJlYWR5U3Rh
dGUoKSl7aj0KLnB1c2goay5nZXQoImlkIikpfX0pO3JldHVybiBqfSxnZXRCeUhpZDpmdW5jdGlv
bihqKXtyZXR1cm4gXy5maXJzdCh0aGlzLmZpPQpsdGVyKGZ1bmN0aW9uKGspe3JldHVybiBrLmdl
dCgiaGlkIik9M0Q9M0Q9M0RqfSkpfSxnZXRWaXNpYmxlOmZ1bmN0aW9uKGosbSw9Cmwpe2w9M0Rs
fHxbXTt2YXIgaz0zRG5ldyBhKHRoaXMuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBuLmlzVmlz
aWJsZShqLG0pfT0KKSk7Xy5lYWNoKGwsZnVuY3Rpb24obil7aWYoIV8uaXNGdW5jdGlvbihuKSl7
cmV0dXJufWs9M0RuZXcgYShrLmZpbHRlcihuKSl9PQopO3JldHVybiBrfSxoYXZlRGV0YWlsczpm
dW5jdGlvbigpe3JldHVybiB0aGlzLmFsbChmdW5jdGlvbihqKXtyZXR1cm4gai5oYXM9CkRldGFp
bHMoKX0pfSxmZXRjaEFsbERldGFpbHM6ZnVuY3Rpb24oayl7az0zRGt8fHt9O3ZhciBqPTNEe2Rl
dGFpbHM6ImFsbCJ9Oz0Kay5kYXRhPTNEKGsuZGF0YSk/KF8uZXh0ZW5kKGsuZGF0YSxqKSk6KGop
O3JldHVybiB0aGlzLmZldGNoKGspfSxhamF4UXVldWU6PQpmdW5jdGlvbihtLGwpe3ZhciBrPTNE
alF1ZXJ5LkRlZmVycmVkKCksaj0zRHRoaXMubGVuZ3RoLG89M0RbXTtpZighail7ay5yZXM9Cm9s
dmUoW10pO3JldHVybiBrfXZhciBuPTNEdGhpcy5jaGFpbigpLnJldmVyc2UoKS5tYXAoZnVuY3Rp
b24ocSxwKXtyZXR1cm4gZj0KdW5jdGlvbigpe3ZhciByPTNEbS5jYWxsKHEsbCk7ci5kb25lKGZ1
bmN0aW9uKHMpe2subm90aWZ5KHtjdXJyOnAsdG90YWw6aixyPQplc3BvbnNlOnMsbW9kZWw6cX0p
fSk7ci5hbHdheXMoZnVuY3Rpb24ocyl7by5wdXNoKHMpO2lmKG4ubGVuZ3RoKXtuLnNoaWZ0KCk9
CigpfWVsc2V7ay5yZXNvbHZlKG8pfX0pfX0pLnZhbHVlKCk7bi5zaGlmdCgpKCk7cmV0dXJuIGt9
LG1hdGNoZXM6ZnVuY3Rpb24oaj0KKXtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oayl7cmV0
dXJuIGsubWF0Y2hlcyhqKX0pfSxzZXQ6ZnVuY3Rpb24obCxqKXt2PQphciBrPTNEdGhpcztsPTNE
Xy5tYXAobCxmdW5jdGlvbihuKXt2YXIgbz0zRGsuZ2V0KG4uaWQpO2lmKCFvKXtyZXR1cm4gbn12
YXI9CiBtPTNEby50b0pTT04oKTtfLmV4dGVuZChtLG4pO3JldHVybiBtfSk7QmFja2JvbmUuQ29s
bGVjdGlvbi5wcm90b3R5cGUuc2V0Lj0KY2FsbCh0aGlzLGwsail9LHRvU3RyaW5nOmZ1bmN0aW9u
KCl7cmV0dXJuKFsiSERBQ29sbGVjdGlvbigiLFt0aGlzLmhpc3RvcnlJPQpkLHRoaXMubGVuZ3Ro
XS5qb2luKCksIikiXS5qb2luKCIiKSl9fSk7cmV0dXJue0hpc3RvcnlEYXRhc2V0QXNzb2NpYXRp
b246aSw9CkhEQUNvbGxlY3Rpb246YX19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpk
aWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMx
OTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL3BhY2tl
ZC9tdmMvaGlzdG9yeS9hbm5vdGF0ZWQtaGlzdG9yeS1wYW5lbD0KLmpzCi0tLSBhL3N0YXRpYy9z
Y3JpcHRzL3BhY2tlZC9tdmMvaGlzdG9yeS9hbm5vdGF0ZWQtaGlzdG9yeS1wYW5lbC5qcworKysg
Yi9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2hpc3RvcnkvYW5ub3RhdGVkLWhpc3RvcnktcGFu
ZWwuanMKQEAgLTEsMSArMSwxIEBACi1kZWZpbmUoWyJtdmMvZGF0YXNldC9oZGEtbW9kZWwiLCJt
dmMvZGF0YXNldC9oZGEtYmFzZSIsIm12Yy9oaXN0b3J5L3JlYWRvbj0KbHktaGlzdG9yeS1wYW5l
bCJdLGZ1bmN0aW9uKGMsYSxiKXt2YXIgZD0zRGIuUmVhZE9ubHlIaXN0b3J5UGFuZWwuZXh0ZW5k
KHtjPQpsYXNzTmFtZToiYW5ub3RhdGVkLWhpc3RvcnktcGFuZWwiLEhEQVZpZXdDbGFzczphLkhE
QUJhc2VWaWV3LHJlbmRlck1vZGVsOmY9CnVuY3Rpb24oKXt0aGlzLiRlbC5hZGRDbGFzcyh0aGlz
LmNsYXNzTmFtZSk7dmFyIGc9M0RiLlJlYWRPbmx5SGlzdG9yeVBhbmVsLj0KcHJvdG90eXBlLnJl
bmRlck1vZGVsLmNhbGwodGhpcyksZT0zRHRoaXMuJGRhdGFzZXRzTGlzdChnKSxmPTNEJCgiPHRh
YmxlLz4iPQopLmFkZENsYXNzKCJkYXRhc2V0cy1saXN0IGRhdGFzZXRzLXRhYmxlIik7Zi5hcHBl
bmQoZS5jaGlsZHJlbigpKTtlLnJlcGxhY2U9CldpdGgoZik7Zy5maW5kKCIuaGlzdG9yeS1zdWJ0
aXRsZSIpLmFmdGVyKHRoaXMucmVuZGVySGlzdG9yeUFubm90YXRpb24oKSk7Zz0KLmZpbmQoIi5o
aXN0b3J5LXNlYXJjaC1idG4iKS5oaWRlKCk7Zy5maW5kKCIuaGlzdG9yeS1jb250cm9scyIpLmFm
dGVyKGcuZmluPQpkKCIuaGlzdG9yeS1zZWFyY2gtY29udHJvbHMiKS5zaG93KCkpO3JldHVybiBn
fSxyZW5kZXJIaXN0b3J5QW5ub3RhdGlvbjpmdW49CmN0aW9uKCl7dmFyIGU9M0R0aGlzLm1vZGVs
LmdldCgiYW5ub3RhdGlvbiIpO2lmKCFlKXtyZXR1cm4gbnVsbH1yZXR1cm4gJChbJz0KPGRpdiBj
bGFzcz0zRCJoaXN0b3J5LWFubm90YXRpb24iPicsZSwiPC9kaXY+Il0uam9pbigiIikpfSxyZW5k
ZXJIZGFzOmZ1bmN0PQppb24oZil7Zj0zRGZ8fHRoaXMuJGVsO3ZhciBlPTNEYi5SZWFkT25seUhp
c3RvcnlQYW5lbC5wcm90b3R5cGUucmVuZGVySGRhcy49CmNhbGwodGhpcyxmKTt0aGlzLiRkYXRh
c2V0c0xpc3QoZikucHJlcGVuZCgkKCI8dHIvPiIpLmFkZENsYXNzKCJoZWFkZXJzIikuYT0KcHBl
bmQoWyQoIjx0aC8+IikudGV4dChfbCgiRGF0YXNldCIpKSwkKCI8dGgvPiIpLnRleHQoX2woIkFu
bm90YXRpb24iKSldKSk7PQpyZXR1cm4gZX0sYXR0YWNoSGRhVmlldzpmdW5jdGlvbihoLGYpe2Y9
M0RmfHx0aGlzLiRlbDt2YXIgaT0zRF8uZmluZChoLmVsLmM9Cmxhc3NMaXN0LGZ1bmN0aW9uKGop
e3JldHVybigvXnN0YXRlXC0vKS50ZXN0KGopfSksZT0zRGgubW9kZWwuZ2V0KCJhbm5vdGF0aT0K
b24iKXx8IiIsZz0zRCQoIjx0ci8+IikuYWRkQ2xhc3MoImRhdGFzZXQtcm93IikuYXBwZW5kKFsk
KCI8dGQvPiIpLmFkZENsYXNzPQooImRhdGFzZXQtY29udGFpbmVyIikuYXBwZW5kKGguJGVsKS5h
ZGRDbGFzcyhpP2kucmVwbGFjZSgiLSIsIi1jb2xvci0iKToiIik9CiwkKCI8dGQvPiIpLmFkZENs
YXNzKCJhZGRpdGlvbmFsLWluZm8iKS50ZXh0KGUpXSk7dGhpcy4kZGF0YXNldHNMaXN0KGYpLmFw
cD0KZW5kKGcpfSxldmVudHM6Xy5leHRlbmQoXy5jbG9uZShiLlJlYWRPbmx5SGlzdG9yeVBhbmVs
LnByb3RvdHlwZS5ldmVudHMpLHsiPQpjbGljayB0ciI6ZnVuY3Rpb24oZSl7JChlLmN1cnJlbnRU
YXJnZXQpLmZpbmQoIi5kYXRhc2V0LXRpdGxlLWJhciIpLmNsaWNrKCk9Cn0sImNsaWNrIC5pY29u
LWJ0biI6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX19KSx0b1N0cmluZzpmdW5jdGlv
bigpez0KcmV0dXJuIkFubm90YXRlZEhpc3RvcnlQYW5lbCgiKygodGhpcy5tb2RlbCk/KHRoaXMu
bW9kZWwuZ2V0KCJuYW1lIikpOigiIikpPQorIikifX0pO3JldHVybntBbm5vdGF0ZWRIaXN0b3J5
UGFuZWw6ZH19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitkZWZpbmUoWyJtdmMvZGF0
YXNldC9oZGEtbW9kZWwiLCJtdmMvZGF0YXNldC9oZGEtYmFzZSIsIm12Yy9oaXN0b3J5L3JlYWRv
bj0KbHktaGlzdG9yeS1wYW5lbCIsInV0aWxzL2xvY2FsaXphdGlvbiJdLGZ1bmN0aW9uKGQsYSxi
LGMpe3ZhciBlPTNEYi5SZWFkT25sPQp5SGlzdG9yeVBhbmVsLmV4dGVuZCh7Y2xhc3NOYW1lOiJh
bm5vdGF0ZWQtaGlzdG9yeS1wYW5lbCIsSERBVmlld0NsYXNzOmEuSEQ9CkFCYXNlVmlldyxyZW5k
ZXJNb2RlbDpmdW5jdGlvbigpe3RoaXMuJGVsLmFkZENsYXNzKHRoaXMuY2xhc3NOYW1lKTt2YXIg
aD0zRD0KYi5SZWFkT25seUhpc3RvcnlQYW5lbC5wcm90b3R5cGUucmVuZGVyTW9kZWwuY2FsbCh0
aGlzKSxmPTNEdGhpcy4kZGF0YXNldHNMPQppc3QoaCksZz0zRCQoIjx0YWJsZS8+IikuYWRkQ2xh
c3MoImRhdGFzZXRzLWxpc3QgZGF0YXNldHMtdGFibGUiKTtnLmFwcGVuZCg9CmYuY2hpbGRyZW4o
KSk7Zi5yZXBsYWNlV2l0aChnKTtoLmZpbmQoIi5oaXN0b3J5LXN1YnRpdGxlIikuYWZ0ZXIodGhp
cy5yZW5kZT0Kckhpc3RvcnlBbm5vdGF0aW9uKCkpO2guZmluZCgiLmhpc3Rvcnktc2VhcmNoLWJ0
biIpLmhpZGUoKTtoLmZpbmQoIi5oaXN0b3J5PQotY29udHJvbHMiKS5hZnRlcihoLmZpbmQoIi5o
aXN0b3J5LXNlYXJjaC1jb250cm9scyIpLnNob3coKSk7cmV0dXJuIGh9LHJlbmQ9CmVySGlzdG9y
eUFubm90YXRpb246ZnVuY3Rpb24oKXt2YXIgZj0zRHRoaXMubW9kZWwuZ2V0KCJhbm5vdGF0aW9u
Iik7aWYoIWYpez0KcmV0dXJuIG51bGx9cmV0dXJuICQoWyc8ZGl2IGNsYXNzPTNEImhpc3Rvcnkt
YW5ub3RhdGlvbiI+JyxmLCI8L2Rpdj4iXS5qb2luPQooIiIpKX0scmVuZGVySGRhczpmdW5jdGlv
bihnKXtnPTNEZ3x8dGhpcy4kZWw7dmFyIGY9M0RiLlJlYWRPbmx5SGlzdG9yeVBhbmU9CmwucHJv
dG90eXBlLnJlbmRlckhkYXMuY2FsbCh0aGlzLGcpO3RoaXMuJGRhdGFzZXRzTGlzdChnKS5wcmVw
ZW5kKCQoIjx0ci8+Ij0KKS5hZGRDbGFzcygiaGVhZGVycyIpLmFwcGVuZChbJCgiPHRoLz4iKS50
ZXh0KGMoIkRhdGFzZXQiKSksJCgiPHRoLz4iKS50ZXh0PQooYygiQW5ub3RhdGlvbiIpKV0pKTty
ZXR1cm4gZn0sYXR0YWNoSGRhVmlldzpmdW5jdGlvbihpLGcpe2c9M0RnfHx0aGlzLiRlbDs9CnZh
ciBqPTNEXy5maW5kKGkuZWwuY2xhc3NMaXN0LGZ1bmN0aW9uKGspe3JldHVybigvXnN0YXRlXC0v
KS50ZXN0KGspfSksZj0zRD0KaS5tb2RlbC5nZXQoImFubm90YXRpb24iKXx8IiIsaD0zRCQoIjx0
ci8+IikuYWRkQ2xhc3MoImRhdGFzZXQtcm93IikuYXBwZW5kPQooWyQoIjx0ZC8+IikuYWRkQ2xh
c3MoImRhdGFzZXQtY29udGFpbmVyIikuYXBwZW5kKGkuJGVsKS5hZGRDbGFzcyhqP2oucmVwbGE9
CmNlKCItIiwiLWNvbG9yLSIpOiIiKSwkKCI8dGQvPiIpLmFkZENsYXNzKCJhZGRpdGlvbmFsLWlu
Zm8iKS50ZXh0KGYpXSk7dGhpcz0KLiRkYXRhc2V0c0xpc3QoZykuYXBwZW5kKGgpfSxldmVudHM6
Xy5leHRlbmQoXy5jbG9uZShiLlJlYWRPbmx5SGlzdG9yeVBhbmVsPQoucHJvdG90eXBlLmV2ZW50
cykseyJjbGljayB0ciI6ZnVuY3Rpb24oZil7JChmLmN1cnJlbnRUYXJnZXQpLmZpbmQoIi5kYXRh
c2U9CnQtdGl0bGUtYmFyIikuY2xpY2soKX0sImNsaWNrIC5pY29uLWJ0biI6ZnVuY3Rpb24oZil7
Zi5zdG9wUHJvcGFnYXRpb24oKX19KT0KLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIkFubm90
YXRlZEhpc3RvcnlQYW5lbCgiKygodGhpcy5tb2RlbCk/KHRoaXMubW9kPQplbC5nZXQoIm5hbWUi
KSk6KCIiKSkrIikifX0pO3JldHVybntBbm5vdGF0ZWRIaXN0b3J5UGFuZWw6ZX19KTsKXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZj
NzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAy
Y2IyIHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvaGlzdG9yeS9jdXJyZW50LWhpc3RvcnktcGFu
ZWwuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2N1cnJlbnQtaGlz
dG9yeS1wYW5lbC5qcworKysgYi9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2hpc3RvcnkvY3Vy
cmVudC1oaXN0b3J5LXBhbmVsLmpzCkBAIC0xLDEgKzEsMSBAQAotZGVmaW5lKFsibXZjL2RhdGFz
ZXQvaGRhLWVkaXQiLCJtdmMvaGlzdG9yeS9oaXN0b3J5LXBhbmVsIiwibXZjL2Jhc2UtbXZjIl09
CixmdW5jdGlvbihiLGYsYyl7dmFyIGQ9M0RjLlNlc3Npb25TdG9yYWdlTW9kZWwuZXh0ZW5kKHtk
ZWZhdWx0czp7c2VhcmNoaW5nOj0KZmFsc2UsdGFnc0VkaXRvclNob3duOmZhbHNlLGFubm90YXRp
b25FZGl0b3JTaG93bjpmYWxzZX0sdG9TdHJpbmc6ZnVuY3Rpb24oPQope3JldHVybiJIaXN0b3J5
UGFuZWxQcmVmcygiK0pTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpKyIpIn19KTtkLnN0b3Jh
Z2U9CktleT0zRGZ1bmN0aW9uIGUoKXtyZXR1cm4oImhpc3RvcnktcGFuZWwiKX07dmFyIGE9M0Rm
Lkhpc3RvcnlQYW5lbC5leHRlbmQoez0KSERBVmlld0NsYXNzOmIuSERBRWRpdFZpZXcsZW1wdHlN
c2c6X2woIlRoaXMgaGlzdG9yeSBpcyBlbXB0eS4gQ2xpY2sgJ0dldCBEPQphdGEnIG9uIHRoZSBs
ZWZ0IHRvb2wgbWVudSB0byBzdGFydCIpLG5vbmVGb3VuZE1zZzpfbCgiTm8gbWF0Y2hpbmcgZGF0
YXNldHM9CiBmb3VuZCIpLGluaXRpYWxpemU6ZnVuY3Rpb24oZyl7Zz0zRGd8fHt9O3RoaXMucHJl
ZmVyZW5jZXM9M0RuZXcgZChfLmV4dGVuZD0KKHtpZDpkLnN0b3JhZ2VLZXkoKX0sXy5waWNrKGcs
Xy5rZXlzKGQucHJvdG90eXBlLmRlZmF1bHRzKSkpKTtmLkhpc3RvcnlQYW5lPQpsLnByb3RvdHlw
ZS5pbml0aWFsaXplLmNhbGwodGhpcyxnKX0sbG9hZEN1cnJlbnRIaXN0b3J5OmZ1bmN0aW9uKGgp
e3ZhciBnPQo9M0R0aGlzO3JldHVybiB0aGlzLmxvYWRIaXN0b3J5V2l0aEhEQURldGFpbHMoImN1
cnJlbnQiLGgpLnRoZW4oZnVuY3Rpb24oaiw9Cmkpe2cudHJpZ2dlcigiY3VycmVudC1oaXN0b3J5
IixnKX0pfSxzd2l0Y2hUb0hpc3Rvcnk6ZnVuY3Rpb24oaixpKXt2YXIgZz0zRD0KdGhpcyxoPTNE
ZnVuY3Rpb24oKXtyZXR1cm4galF1ZXJ5LmFqYXgoe3VybDpnYWxheHlfY29uZmlnLnJvb3QrImFw
aS9oaXN0b3JpPQplcy8iK2orIi9zZXRfYXNfY3VycmVudCIsbWV0aG9kOiJQVVQifSl9O3JldHVy
biB0aGlzLmxvYWRIaXN0b3J5V2l0aEhEQURldGE9CmlscyhqLGksaCkudGhlbihmdW5jdGlvbihs
LGspe2cudHJpZ2dlcigic3dpdGNoZWQtaGlzdG9yeSIsZyl9KX0sY3JlYXRlTmV3SD0KaXN0b3J5
OmZ1bmN0aW9uKGkpe2lmKCFHYWxheHl8fCFHYWxheHkuY3VyclVzZXJ8fEdhbGF4eS5jdXJyVXNl
ci5pc0Fub255bW91PQpzKCkpe3RoaXMuZGlzcGxheU1lc3NhZ2UoImVycm9yIixfbCgiWW91IG11
c3QgYmUgbG9nZ2VkIGluIHRvIGNyZWF0ZSBoaXN0b3I9CmllcyIpKTtyZXR1cm4gJC53aGVuKCl9
dmFyIGc9M0R0aGlzLGg9M0RmdW5jdGlvbigpe3JldHVybiBqUXVlcnkucG9zdChnYWxheD0KeV9j
b25maWcucm9vdCsiYXBpL2hpc3RvcmllcyIse2N1cnJlbnQ6dHJ1ZX0pfTtyZXR1cm4gdGhpcy5s
b2FkSGlzdG9yeSh1bmRlPQpmaW5lZCxpLGgpLnRoZW4oZnVuY3Rpb24oayxqKXtnLnRyaWdnZXIo
Im5ldy1oaXN0b3J5IixnKX0pfSxzZXRNb2RlbDpmdW5jdGk9Cm9uKGgsZyxpKXtmLkhpc3RvcnlQ
YW5lbC5wcm90b3R5cGUuc2V0TW9kZWwuY2FsbCh0aGlzLGgsZyxpKTtpZih0aGlzLm1vZGVsKT0K
e3RoaXMubG9nKCJjaGVja2luZyBmb3IgdXBkYXRlcyIpO3RoaXMubW9kZWwuY2hlY2tGb3JVcGRh
dGVzKCl9cmV0dXJuIHRoaXN9PQosX3NldFVwTW9kZWxFdmVudEhhbmRsZXJzOmZ1bmN0aW9uKCl7
Zi5IaXN0b3J5UGFuZWwucHJvdG90eXBlLl9zZXRVcE1vZGVsRXY9CmVudEhhbmRsZXJzLmNhbGwo
dGhpcyk7aWYoR2FsYXh5JiZHYWxheHkucXVvdGFNZXRlcil7dGhpcy5saXN0ZW5Ubyh0aGlzLm1v
ZD0KZWwsImNoYW5nZTpuaWNlX3NpemUiLGZ1bmN0aW9uKCl7R2FsYXh5LnF1b3RhTWV0ZXIudXBk
YXRlKCl9KX10aGlzLm1vZGVsLmhkPQphcy5vbigic3RhdGU6cmVhZHkiLGZ1bmN0aW9uKGgsaSxn
KXtpZigoIWguZ2V0KCJ2aXNpYmxlIikpJiYoIXRoaXMuc3RvcmFnZS49CmdldCgic2hvd19oaWRk
ZW4iKSkpe3RoaXMucmVtb3ZlSGRhVmlldyh0aGlzLmhkYVZpZXdzW2guaWRdKX19LHRoaXMpfSxy
ZW5kZT0KcjpmdW5jdGlvbihpLGope3RoaXMubG9nKCJyZW5kZXI6IixpLGopO2k9M0QoaT0zRD0z
RD0zRHVuZGVmaW5lZCk/KHRoaXMuZnhTPQpwZWVkKTooaSk7dmFyIGc9M0R0aGlzLGg7aWYodGhp
cy5tb2RlbCl7aD0zRHRoaXMucmVuZGVyTW9kZWwoKX1lbHNle2g9M0R0aGk9CnMucmVuZGVyV2l0
aG91dE1vZGVsKCl9JChnKS5xdWV1ZSgiZngiLFtmdW5jdGlvbihrKXtpZihpJiZnLiRlbC5pcygi
OnZpc2libD0KZSIpKXtnLiRlbC5mYWRlT3V0KGksayl9ZWxzZXtrKCl9fSxmdW5jdGlvbihrKXtn
LiRlbC5lbXB0eSgpO2lmKGgpe2cuJGVsLmFwPQpwZW5kKGguY2hpbGRyZW4oKSk7Zy5yZW5kZXJC
YXNlZE9uUHJlZnMoKX1rKCl9LGZ1bmN0aW9uKGspe2lmKGkmJiFnLiRlbC5pcyg9CiI6dmlzaWJs
ZSIpKXtnLiRlbC5mYWRlSW4oaSxrKX1lbHNle2soKX19LGZ1bmN0aW9uKGspe2lmKGope2ouY2Fs
bCh0aGlzKX1nLj0KdHJpZ2dlcigicmVuZGVyZWQiLHRoaXMpO2soKX1dKTtyZXR1cm4gdGhpc30s
cmVuZGVyQmFzZWRPblByZWZzOmZ1bmN0aW9uKCl7PQppZih0aGlzLnByZWZlcmVuY2VzLmdldCgi
c2VhcmNoaW5nIikpe3RoaXMudG9nZ2xlU2VhcmNoQ29udHJvbHMoMCx0cnVlKX19LF89CnJlbmRl
ckVtcHR5TXNnOmZ1bmN0aW9uKGkpe3ZhciBoPTNEdGhpcyxnPTNEaC4kZW1wdHlNZXNzYWdlKGkp
LGo9M0QkKCIudG9vbD0KTWVudUNvbnRhaW5lciIpO2lmKChfLmlzRW1wdHkoaC5oZGFWaWV3cykm
JiFoLnNlYXJjaEZvcikmJihHYWxheHkmJkdhbGF4eS51PQpwbG9hZCYmai5zaXplKCkpKXtnLmVt
cHR5KCk7Zy5odG1sKFtfbCgiVGhpcyBoaXN0b3J5IGlzIGVtcHR5LiAiKSxfbCgiWW91IGM9CmFu
ICIpLCc8YSBjbGFzcz0zRCJ1cGxvYWRlci1saW5rIiBocmVmPTNEImphdmFzY3JpcHQ6dm9pZCgw
KSI+JyxfbCgibG9hZCB5bz0KdXIgb3duIGRhdGEiKSwiPC9hPiIsX2woIiBvciAiKSwnPGEgY2xh
c3M9M0QiZ2V0LWRhdGEtbGluayIgaHJlZj0zRCJqYXZhc2NyPQppcHQ6dm9pZCgwKSI+JyxfbCgi
Z2V0IGRhdGEgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UiKSwiPC9hPiJdLmpvaW4oIiIpKTtnLmY9
CmluZCgiLnVwbG9hZGVyLWxpbmsiKS5jbGljayhmdW5jdGlvbihrKXtHYWxheHkudXBsb2FkLl9l
dmVudFNob3coayl9KTtnLmZpbj0KZCgiLmdldC1kYXRhLWxpbmsiKS5jbGljayhmdW5jdGlvbihr
KXtqLnBhcmVudCgpLnNjcm9sbFRvcCgwKTtqLmZpbmQoJ3NwYW46PQpjb250YWlucygiR2V0IERh
dGEiKScpLmNsaWNrKCl9KTtnLnNob3coKX1lbHNle2YuSGlzdG9yeVBhbmVsLnByb3RvdHlwZS5f
cmU9Cm5kZXJFbXB0eU1zZy5jYWxsKHRoaXMsaSl9cmV0dXJuIHRoaXN9LHRvZ2dsZVNlYXJjaENv
bnRyb2xzOmZ1bmN0aW9uKGgsZyl7dj0KYXIgaT0zRGYuSGlzdG9yeVBhbmVsLnByb3RvdHlwZS50
b2dnbGVTZWFyY2hDb250cm9scy5jYWxsKHRoaXMsaCxnKTt0aGlzLnByPQplZmVyZW5jZXMuc2V0
KCJzZWFyY2hpbmciLGkpfSxfcmVuZGVyVGFnczpmdW5jdGlvbihnKXt2YXIgaD0zRHRoaXM7Zi5I
aXN0b3I9CnlQYW5lbC5wcm90b3R5cGUuX3JlbmRlclRhZ3MuY2FsbCh0aGlzLGcpO2lmKHRoaXMu
cHJlZmVyZW5jZXMuZ2V0KCJ0YWdzRWRpdD0Kb3JTaG93biIpKXt0aGlzLnRhZ3NFZGl0b3IudG9n
Z2xlKHRydWUpfXRoaXMudGFnc0VkaXRvci5vbigiaGlkZGVuVW50aWxBY3RpPQp2YXRlZDpzaG93
biBoaWRkZW5VbnRpbEFjdGl2YXRlZDpoaWRkZW4iLGZ1bmN0aW9uKGkpe2gucHJlZmVyZW5jZXMu
c2V0KCJ0YWc9CnNFZGl0b3JTaG93biIsaS5oaWRkZW4pfSl9LF9yZW5kZXJBbm5vdGF0aW9uOmZ1
bmN0aW9uKGcpe3ZhciBoPTNEdGhpcztmLkhpcz0KdG9yeVBhbmVsLnByb3RvdHlwZS5fcmVuZGVy
QW5ub3RhdGlvbi5jYWxsKHRoaXMsZyk7aWYodGhpcy5wcmVmZXJlbmNlcy5nZXQoPQoiYW5ub3Rh
dGlvbkVkaXRvclNob3duIikpe3RoaXMuYW5ub3RhdGlvbkVkaXRvci50b2dnbGUodHJ1ZSl9dGhp
cy5hbm5vdGF0aW89Cm5FZGl0b3Iub24oImhpZGRlblVudGlsQWN0aXZhdGVkOnNob3duIGhpZGRl
blVudGlsQWN0aXZhdGVkOmhpZGRlbiIsZnVuY3Rpbz0KbihpKXtoLnByZWZlcmVuY2VzLnNldCgi
YW5ub3RhdGlvbkVkaXRvclNob3duIixpLmhpZGRlbil9KX0sY29ubmVjdFRvUXVvdGFNPQpldGVy
OmZ1bmN0aW9uKGcpe2lmKCFnKXtyZXR1cm4gdGhpc310aGlzLmxpc3RlblRvKGcsInF1b3RhOm92
ZXIiLHRoaXMuc2hvd1E9CnVvdGFNZXNzYWdlKTt0aGlzLmxpc3RlblRvKGcsInF1b3RhOnVuZGVy
Iix0aGlzLmhpZGVRdW90YU1lc3NhZ2UpO3RoaXMub24oIj0KcmVuZGVyZWQgcmVuZGVyZWQ6aW5p
dGlhbCIsZnVuY3Rpb24oKXtpZihnJiZnLmlzT3ZlclF1b3RhKCkpe3RoaXMuc2hvd1F1b3RhPQpN
ZXNzYWdlKCl9fSk7cmV0dXJuIHRoaXN9LHNob3dRdW90YU1lc3NhZ2U6ZnVuY3Rpb24oKXt2YXIg
Zz0zRHRoaXMuJGVsLmZpbmQ9CigiLnF1b3RhLW1lc3NhZ2UiKTtpZihnLmlzKCI6aGlkZGVuIikp
e2cuc2xpZGVEb3duKHRoaXMuZnhTcGVlZCl9fSxoaWRlUXVvdD0KYU1lc3NhZ2U6ZnVuY3Rpb24o
KXt2YXIgZz0zRHRoaXMuJGVsLmZpbmQoIi5xdW90YS1tZXNzYWdlIik7aWYoIWcuaXMoIjpoaWRk
PQplbiIpKXtnLnNsaWRlVXAodGhpcy5meFNwZWVkKX19LGNvbm5lY3RUb09wdGlvbnNNZW51OmZ1
bmN0aW9uKGcpe2lmKCFnKXtyZXQ9CnVybiB0aGlzfXRoaXMub24oIm5ldy1zdG9yYWdlIixmdW5j
dGlvbihpLGgpe2lmKGcmJmkpe2cuZmluZEl0ZW1CeUh0bWwoX2woIj0KSW5jbHVkZSBEZWxldGVk
IERhdGFzZXRzIikpLmNoZWNrZWQ9M0RpLmdldCgic2hvd19kZWxldGVkIik7Zy5maW5kSXRlbUJ5
SHRtPQpsKF9sKCJJbmNsdWRlIEhpZGRlbiBEYXRhc2V0cyIpKS5jaGVja2VkPTNEaS5nZXQoInNo
b3dfaGlkZGVuIil9fSk7cmV0dXJuIHQ9Cmhpc30sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4i
Q3VycmVudEhpc3RvcnlQYW5lbCgiKygodGhpcy5tb2RlbCk/KHRoaXMubT0Kb2RlbC5nZXQoIm5h
bWUiKSk6KCIiKSkrIikifX0pO3JldHVybntDdXJyZW50SGlzdG9yeVBhbmVsOmF9fSk7ClwgTm8g
bmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGVmaW5lKFsibXZjL2RhdGFzZXQvaGRhLWVkaXQiLCJt
dmMvaGlzdG9yeS9oaXN0b3J5LXBhbmVsIiwibXZjL2Jhc2UtbXZjIiw9CiJ1dGlscy9sb2NhbGl6
YXRpb24iXSxmdW5jdGlvbihiLGcsYyxlKXt2YXIgZD0zRGMuU2Vzc2lvblN0b3JhZ2VNb2RlbC5l
eHRlbj0KZCh7ZGVmYXVsdHM6e3NlYXJjaGluZzpmYWxzZSx0YWdzRWRpdG9yU2hvd246ZmFsc2Us
YW5ub3RhdGlvbkVkaXRvclNob3duOmZhPQpsc2V9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJu
Ikhpc3RvcnlQYW5lbFByZWZzKCIrSlNPTi5zdHJpbmdpZnkodGhpcy50b0o9ClNPTigpKSsiKSJ9
fSk7ZC5zdG9yYWdlS2V5PTNEZnVuY3Rpb24gZigpe3JldHVybigiaGlzdG9yeS1wYW5lbCIpfTt2
YXIgYT0zRD0KZy5IaXN0b3J5UGFuZWwuZXh0ZW5kKHtIREFWaWV3Q2xhc3M6Yi5IREFFZGl0Vmll
dyxlbXB0eU1zZzplKCJUaGlzIGhpc3RvcnkgPQppcyBlbXB0eS4gQ2xpY2sgJ0dldCBEYXRhJyBv
biB0aGUgbGVmdCB0b29sIG1lbnUgdG8gc3RhcnQiKSxub25lRm91bmRNc2c6ZSg9CiJObyBtYXRj
aGluZyBkYXRhc2V0cyBmb3VuZCIpLGluaXRpYWxpemU6ZnVuY3Rpb24oaCl7aD0zRGh8fHt9O3Ro
aXMucHJlZmVyZT0KbmNlcz0zRG5ldyBkKF8uZXh0ZW5kKHtpZDpkLnN0b3JhZ2VLZXkoKX0sXy5w
aWNrKGgsXy5rZXlzKGQucHJvdG90eXBlLmRlZmF1PQpsdHMpKSkpO2cuSGlzdG9yeVBhbmVsLnBy
b3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxoKX0sbG9hZEN1cnJlbnRIaXN0b3I9Cnk6ZnVu
Y3Rpb24oaSl7dmFyIGg9M0R0aGlzO3JldHVybiB0aGlzLmxvYWRIaXN0b3J5V2l0aEhEQURldGFp
bHMoImN1cnJlbnQiLD0KaSkudGhlbihmdW5jdGlvbihrLGope2gudHJpZ2dlcigiY3VycmVudC1o
aXN0b3J5IixoKX0pfSxzd2l0Y2hUb0hpc3Rvcnk6ZnVuPQpjdGlvbihrLGope3ZhciBoPTNEdGhp
cyxpPTNEZnVuY3Rpb24oKXtyZXR1cm4galF1ZXJ5LmFqYXgoe3VybDpnYWxheHlfY29uZmk9Cmcu
cm9vdCsiYXBpL2hpc3Rvcmllcy8iK2srIi9zZXRfYXNfY3VycmVudCIsbWV0aG9kOiJQVVQifSl9
O3JldHVybiB0aGlzLmxvYT0KZEhpc3RvcnlXaXRoSERBRGV0YWlscyhrLGosaSkudGhlbihmdW5j
dGlvbihtLGwpe2gudHJpZ2dlcigic3dpdGNoZWQtaGlzdG9yPQp5IixoKX0pfSxjcmVhdGVOZXdI
aXN0b3J5OmZ1bmN0aW9uKGope2lmKCFHYWxheHl8fCFHYWxheHkuY3VyclVzZXJ8fEdhbGF4eS49
CmN1cnJVc2VyLmlzQW5vbnltb3VzKCkpe3RoaXMuZGlzcGxheU1lc3NhZ2UoImVycm9yIixlKCJZ
b3UgbXVzdCBiZSBsb2dnZWQgaT0KbiB0byBjcmVhdGUgaGlzdG9yaWVzIikpO3JldHVybiAkLndo
ZW4oKX12YXIgaD0zRHRoaXMsaT0zRGZ1bmN0aW9uKCl7cmV0dXJuPQogalF1ZXJ5LnBvc3QoZ2Fs
YXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaWVzIix7Y3VycmVudDp0cnVlfSl9O3JldHVybiB0
aGk9CnMubG9hZEhpc3RvcnkodW5kZWZpbmVkLGosaSkudGhlbihmdW5jdGlvbihsLGspe2gudHJp
Z2dlcigibmV3LWhpc3RvcnkiLGgpfT0KKX0sc2V0TW9kZWw6ZnVuY3Rpb24oaSxoLGope2cuSGlz
dG9yeVBhbmVsLnByb3RvdHlwZS5zZXRNb2RlbC5jYWxsKHRoaXMsaSxoPQosaik7aWYodGhpcy5t
b2RlbCl7dGhpcy5sb2coImNoZWNraW5nIGZvciB1cGRhdGVzIik7dGhpcy5tb2RlbC5jaGVja0Zv
clVwZGE9CnRlcygpfXJldHVybiB0aGlzfSxfc2V0VXBNb2RlbEV2ZW50SGFuZGxlcnM6ZnVuY3Rp
b24oKXtnLkhpc3RvcnlQYW5lbC5wcm90bz0KdHlwZS5fc2V0VXBNb2RlbEV2ZW50SGFuZGxlcnMu
Y2FsbCh0aGlzKTtpZihHYWxheHkmJkdhbGF4eS5xdW90YU1ldGVyKXt0aGlzPQoubGlzdGVuVG8o
dGhpcy5tb2RlbCwiY2hhbmdlOm5pY2Vfc2l6ZSIsZnVuY3Rpb24oKXtHYWxheHkucXVvdGFNZXRl
ci51cGRhdGU9CigpfSl9dGhpcy5tb2RlbC5oZGFzLm9uKCJzdGF0ZTpyZWFkeSIsZnVuY3Rpb24o
aSxqLGgpe2lmKCghaS5nZXQoInZpc2libGUiKT0KKSYmKCF0aGlzLnN0b3JhZ2UuZ2V0KCJzaG93
X2hpZGRlbiIpKSl7dGhpcy5yZW1vdmVIZGFWaWV3KHRoaXMuaGRhVmlld3NbaS5pPQpkXSl9fSx0
aGlzKX0scmVuZGVyOmZ1bmN0aW9uKGosayl7dGhpcy5sb2coInJlbmRlcjoiLGosayk7aj0zRChq
PTNEPTNEPTNEdW49CmRlZmluZWQpPyh0aGlzLmZ4U3BlZWQpOihqKTt2YXIgaD0zRHRoaXMsaTtp
Zih0aGlzLm1vZGVsKXtpPTNEdGhpcy5yZW5kZXJNbz0KZGVsKCl9ZWxzZXtpPTNEdGhpcy5yZW5k
ZXJXaXRob3V0TW9kZWwoKX0kKGgpLnF1ZXVlKCJmeCIsW2Z1bmN0aW9uKGwpe2lmKGomPQomaC4k
ZWwuaXMoIjp2aXNpYmxlIikpe2guJGVsLmZhZGVPdXQoaixsKX1lbHNle2woKX19LGZ1bmN0aW9u
KGwpe2guJGVsLmVtcHQ9CnkoKTtpZihpKXtoLiRlbC5hcHBlbmQoaS5jaGlsZHJlbigpKTtoLnJl
bmRlckJhc2VkT25QcmVmcygpfWwoKX0sZnVuY3Rpb24obD0KKXtpZihqJiYhaC4kZWwuaXMoIjp2
aXNpYmxlIikpe2guJGVsLmZhZGVJbihqLGwpfWVsc2V7bCgpfX0sZnVuY3Rpb24obCl7aWYoPQpr
KXtrLmNhbGwodGhpcyl9aC50cmlnZ2VyKCJyZW5kZXJlZCIsdGhpcyk7bCgpfV0pO3JldHVybiB0
aGlzfSxyZW5kZXJCYXNlZE89Cm5QcmVmczpmdW5jdGlvbigpe2lmKHRoaXMucHJlZmVyZW5jZXMu
Z2V0KCJzZWFyY2hpbmciKSl7dGhpcy50b2dnbGVTZWFyY2hDbz0KbnRyb2xzKDAsdHJ1ZSl9fSxf
cmVuZGVyRW1wdHlNc2c6ZnVuY3Rpb24oail7dmFyIGk9M0R0aGlzLGg9M0RpLiRlbXB0eU1lc3Nh
PQpnZShqKSxrPTNEJCgiLnRvb2xNZW51Q29udGFpbmVyIik7aWYoKF8uaXNFbXB0eShpLmhkYVZp
ZXdzKSYmIWkuc2VhcmNoRm9yKSY9CiYoR2FsYXh5JiZHYWxheHkudXBsb2FkJiZrLnNpemUoKSkp
e2guZW1wdHkoKTtoLmh0bWwoW2UoIlRoaXMgaGlzdG9yeSBpcyBlbT0KcHR5LiAiKSxlKCJZb3Ug
Y2FuICIpLCc8YSBjbGFzcz0zRCJ1cGxvYWRlci1saW5rIiBocmVmPTNEImphdmFzY3JpcHQ6dm9p
ZCgwPQopIj4nLGUoImxvYWQgeW91ciBvd24gZGF0YSIpLCI8L2E+IixlKCIgb3IgIiksJzxhIGNs
YXNzPTNEImdldC1kYXRhLWxpbmsiIGg9CnJlZj0zRCJqYXZhc2NyaXB0OnZvaWQoMCkiPicsZSgi
Z2V0IGRhdGEgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UiKSwiPC9hPiJdLj0Kam9pbigiIikpO2gu
ZmluZCgiLnVwbG9hZGVyLWxpbmsiKS5jbGljayhmdW5jdGlvbihsKXtHYWxheHkudXBsb2FkLl9l
dmVudFNoPQpvdyhsKX0pO2guZmluZCgiLmdldC1kYXRhLWxpbmsiKS5jbGljayhmdW5jdGlvbihs
KXtrLnBhcmVudCgpLnNjcm9sbFRvcCgwKTs9CmsuZmluZCgnc3Bhbjpjb250YWlucygiR2V0IERh
dGEiKScpLmNsaWNrKCl9KTtoLnNob3coKX1lbHNle2cuSGlzdG9yeVBhbmVsLj0KcHJvdG90eXBl
Ll9yZW5kZXJFbXB0eU1zZy5jYWxsKHRoaXMsail9cmV0dXJuIHRoaXN9LHRvZ2dsZVNlYXJjaENv
bnRyb2xzOmZ1PQpuY3Rpb24oaSxoKXt2YXIgaj0zRGcuSGlzdG9yeVBhbmVsLnByb3RvdHlwZS50
b2dnbGVTZWFyY2hDb250cm9scy5jYWxsKHRoaXM9CixpLGgpO3RoaXMucHJlZmVyZW5jZXMuc2V0
KCJzZWFyY2hpbmciLGopfSxfcmVuZGVyVGFnczpmdW5jdGlvbihoKXt2YXIgaT0zRD0KdGhpcztn
Lkhpc3RvcnlQYW5lbC5wcm90b3R5cGUuX3JlbmRlclRhZ3MuY2FsbCh0aGlzLGgpO2lmKHRoaXMu
cHJlZmVyZW5jZXMuPQpnZXQoInRhZ3NFZGl0b3JTaG93biIpKXt0aGlzLnRhZ3NFZGl0b3IudG9n
Z2xlKHRydWUpfXRoaXMudGFnc0VkaXRvci5vbigiaGk9CmRkZW5VbnRpbEFjdGl2YXRlZDpzaG93
biBoaWRkZW5VbnRpbEFjdGl2YXRlZDpoaWRkZW4iLGZ1bmN0aW9uKGope2kucHJlZmVyZT0KbmNl
cy5zZXQoInRhZ3NFZGl0b3JTaG93biIsai5oaWRkZW4pfSl9LF9yZW5kZXJBbm5vdGF0aW9uOmZ1
bmN0aW9uKGgpe3ZhciBpPQo9M0R0aGlzO2cuSGlzdG9yeVBhbmVsLnByb3RvdHlwZS5fcmVuZGVy
QW5ub3RhdGlvbi5jYWxsKHRoaXMsaCk7aWYodGhpcy5wcmU9CmZlcmVuY2VzLmdldCgiYW5ub3Rh
dGlvbkVkaXRvclNob3duIikpe3RoaXMuYW5ub3RhdGlvbkVkaXRvci50b2dnbGUodHJ1ZSl9dD0K
aGlzLmFubm90YXRpb25FZGl0b3Iub24oImhpZGRlblVudGlsQWN0aXZhdGVkOnNob3duIGhpZGRl
blVudGlsQWN0aXZhdGVkOmhpPQpkZGVuIixmdW5jdGlvbihqKXtpLnByZWZlcmVuY2VzLnNldCgi
YW5ub3RhdGlvbkVkaXRvclNob3duIixqLmhpZGRlbil9KX0sY289Cm5uZWN0VG9RdW90YU1ldGVy
OmZ1bmN0aW9uKGgpe2lmKCFoKXtyZXR1cm4gdGhpc310aGlzLmxpc3RlblRvKGgsInF1b3RhOm92
ZT0KciIsdGhpcy5zaG93UXVvdGFNZXNzYWdlKTt0aGlzLmxpc3RlblRvKGgsInF1b3RhOnVuZGVy
Iix0aGlzLmhpZGVRdW90YU1lc3NhPQpnZSk7dGhpcy5vbigicmVuZGVyZWQgcmVuZGVyZWQ6aW5p
dGlhbCIsZnVuY3Rpb24oKXtpZihoJiZoLmlzT3ZlclF1b3RhKCkpe3Q9Cmhpcy5zaG93UXVvdGFN
ZXNzYWdlKCl9fSk7cmV0dXJuIHRoaXN9LHNob3dRdW90YU1lc3NhZ2U6ZnVuY3Rpb24oKXt2YXIg
aD0zRD0KdGhpcy4kZWwuZmluZCgiLnF1b3RhLW1lc3NhZ2UiKTtpZihoLmlzKCI6aGlkZGVuIikp
e2guc2xpZGVEb3duKHRoaXMuZnhTcGVlPQpkKX19LGhpZGVRdW90YU1lc3NhZ2U6ZnVuY3Rpb24o
KXt2YXIgaD0zRHRoaXMuJGVsLmZpbmQoIi5xdW90YS1tZXNzYWdlIik7aWY9CighaC5pcygiOmhp
ZGRlbiIpKXtoLnNsaWRlVXAodGhpcy5meFNwZWVkKX19LGNvbm5lY3RUb09wdGlvbnNNZW51OmZ1
bmN0aW9uKD0KaCl7aWYoIWgpe3JldHVybiB0aGlzfXRoaXMub24oIm5ldy1zdG9yYWdlIixmdW5j
dGlvbihqLGkpe2lmKGgmJmope2guZmluZEl0PQplbUJ5SHRtbChlKCJJbmNsdWRlIERlbGV0ZWQg
RGF0YXNldHMiKSkuY2hlY2tlZD0zRGouZ2V0KCJzaG93X2RlbGV0ZWQiKTtoLmY9CmluZEl0ZW1C
eUh0bWwoZSgiSW5jbHVkZSBIaWRkZW4gRGF0YXNldHMiKSkuY2hlY2tlZD0zRGouZ2V0KCJzaG93
X2hpZGRlbiIpfT0KfSk7cmV0dXJuIHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIkN1
cnJlbnRIaXN0b3J5UGFuZWwoIisoKHRoaXMubW9kPQplbCk/KHRoaXMubW9kZWwuZ2V0KCJuYW1l
IikpOigiIikpKyIpIn19KTtyZXR1cm57Q3VycmVudEhpc3RvcnlQYW5lbDphfX0pOwpcIE5vIG5l
d2xpbmUgYXQgZW5kIG9mIGZpbGUKCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3
OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJj
YjIgc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKLS0t
IGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKKysr
IGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKQEAg
LTEsMSArMSwxIEBACi1kZWZpbmUoWyJtdmMvZGF0YXNldC9oZGEtbW9kZWwiLCJtdmMvYmFzZS1t
dmMiXSxmdW5jdGlvbihiLGEpe3ZhciBkPTNEQmFjaz0KYm9uZS5Nb2RlbC5leHRlbmQoYS5Mb2dn
YWJsZU1peGluKS5leHRlbmQoe2RlZmF1bHRzOnttb2RlbF9jbGFzczoiSGlzdG9yeSIsPQppZDpu
dWxsLG5hbWU6IlVubmFtZWQgSGlzdG9yeSIsc3RhdGU6Im5ldyIsZGlza1NpemU6MCxkZWxldGVk
OmZhbHNlfSx1cmxSb289CnQ6Z2FsYXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaWVzIixyZW5h
bWVVcmw6ZnVuY3Rpb24oKXt2YXIgZj0zRHRoaXMuZ2V0KD0KImlkIik7aWYoIWYpe3JldHVybiB1
bmRlZmluZWR9cmV0dXJuIGdhbGF4eV9jb25maWcucm9vdCsiaGlzdG9yeS9yZW5hbWVfYXN5PQpu
Yz9pZD0zRCIrdGhpcy5nZXQoImlkIil9LGFubm90YXRlVXJsOmZ1bmN0aW9uKCl7dmFyIGY9M0R0
aGlzLmdldCgiaWQiKTtpZig9CiFmKXtyZXR1cm4gdW5kZWZpbmVkfXJldHVybiBnYWxheHlfY29u
ZmlnLnJvb3QrImhpc3RvcnkvYW5ub3RhdGVfYXN5bmM/aWQ9Cj0zRCIrdGhpcy5nZXQoImlkIil9
LHRhZ1VybDpmdW5jdGlvbigpe3ZhciBmPTNEdGhpcy5nZXQoImlkIik7aWYoIWYpe3JldHVybj0K
IHVuZGVmaW5lZH1yZXR1cm4gZ2FsYXh5X2NvbmZpZy5yb290KyJ0YWcvZ2V0X3RhZ2dpbmdfZWx0
X2FzeW5jP2l0ZW1faWQ9M0QiPQordGhpcy5nZXQoImlkIikrIiZpdGVtX2NsYXNzPTNESGlzdG9y
eSJ9LGluaXRpYWxpemU6ZnVuY3Rpb24oZyxoLGYpe2Y9M0RmfHw9Cnt9O3RoaXMubG9nZ2VyPTNE
Zi5sb2dnZXJ8fG51bGw7dGhpcy5sb2codGhpcysiLmluaXRpYWxpemU6IixnLGgsZik7dGhpcy5o
ZD0KYXM9M0RuZXcgYi5IREFDb2xsZWN0aW9uKGh8fFtdLHtoaXN0b3J5SWQ6dGhpcy5nZXQoImlk
Iil9KTtpZihoJiZfLmlzQXJyYXkoPQpoKSl7dGhpcy5oZGFzLnJlc2V0KGgpfXRoaXMuX3NldFVw
TGlzdGVuZXJzKCk7dGhpcy51cGRhdGVUaW1lb3V0SWQ9M0RudWxsfSw9Cl9zZXRVcExpc3RlbmVy
czpmdW5jdGlvbigpe3RoaXMub24oImVycm9yIixmdW5jdGlvbihnLGosZixpLGgpe3RoaXMuZXJy
b3JIYT0KbmRsZXIoZyxqLGYsaSxoKX0pO2lmKHRoaXMuaGRhcyl7dGhpcy5saXN0ZW5Ubyh0aGlz
LmhkYXMsImVycm9yIixmdW5jdGlvbigpPQp7dGhpcy50cmlnZ2VyLmFwcGx5KHRoaXMsWyJlcnJv
cjpoZGFzIl0uY29uY2F0KGpRdWVyeS5tYWtlQXJyYXkoYXJndW1lbnRzKSk9Cil9KX10aGlzLm9u
KCJjaGFuZ2U6aWQiLGZ1bmN0aW9uKGcsZil7aWYodGhpcy5oZGFzKXt0aGlzLmhkYXMuaGlzdG9y
eUlkPTNEZj0KfX0sdGhpcyl9LGVycm9ySGFuZGxlcjpmdW5jdGlvbihnLGosZixpLGgpe3RoaXMu
Y2xlYXJVcGRhdGVUaW1lb3V0KCl9LG93bmVkPQpCeUN1cnJVc2VyOmZ1bmN0aW9uKCl7aWYoIUdh
bGF4eXx8IUdhbGF4eS5jdXJyVXNlcil7cmV0dXJuIGZhbHNlfWlmKEdhbGF4eS49CmN1cnJVc2Vy
LmlzQW5vbnltb3VzKCl8fEdhbGF4eS5jdXJyVXNlci5pZCE9M0Q9M0R0aGlzLmdldCgidXNlcl9p
ZCIpKXtyZXR1cj0KbiBmYWxzZX1yZXR1cm4gdHJ1ZX0saGRhQ291bnQ6ZnVuY3Rpb24oKXtyZXR1
cm4gXy5yZWR1Y2UoXy52YWx1ZXModGhpcy5nZXQoPQoic3RhdGVfZGV0YWlscyIpKSxmdW5jdGlv
bihmLGcpe3JldHVybiBmK2d9LDApfSxjaGVja0ZvclVwZGF0ZXM6ZnVuY3Rpb24oZik9CntpZih0
aGlzLmhkYXMucnVubmluZygpLmxlbmd0aCl7dGhpcy5zZXRVcGRhdGVUaW1lb3V0KCl9ZWxzZXt0
aGlzLnRyaWdnZXIoIj0KcmVhZHkiKTtpZihfLmlzRnVuY3Rpb24oZikpe2YuY2FsbCh0aGlzKX19
cmV0dXJuIHRoaXN9LHNldFVwZGF0ZVRpbWVvdXQ6ZnVuPQpjdGlvbihmKXtmPTNEZnx8ZC5VUERB
VEVfREVMQVk7dmFyIGc9M0R0aGlzO3RoaXMuY2xlYXJVcGRhdGVUaW1lb3V0KCk7dGhpcy49CnVw
ZGF0ZVRpbWVvdXRJZD0zRHNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLnJlZnJlc2goKX0sZik7cmV0
dXJuIHRoaXMudXBkYXRlVD0KaW1lb3V0SWR9LGNsZWFyVXBkYXRlVGltZW91dDpmdW5jdGlvbigp
e2lmKHRoaXMudXBkYXRlVGltZW91dElkKXtjbGVhclRpbWVvPQp1dCh0aGlzLnVwZGF0ZVRpbWVv
dXRJZCk7dGhpcy51cGRhdGVUaW1lb3V0SWQ9M0RudWxsfX0scmVmcmVzaDpmdW5jdGlvbihnLGY9
Cil7Zz0zRGd8fFtdO2Y9M0RmfHx7fTt2YXIgaD0zRHRoaXM7Zi5kYXRhPTNEZi5kYXRhfHx7fTtp
ZihnLmxlbmd0aCl7Zi5kYXRhLj0KZGV0YWlscz0zRGcuam9pbigiLCIpfXZhciBpPTNEdGhpcy5o
ZGFzLmZldGNoKGYpO2kuZG9uZShmdW5jdGlvbihqKXtoLmNoZWNrPQpGb3JVcGRhdGVzKGZ1bmN0
aW9uKCl7dGhpcy5mZXRjaCgpfSl9KTtyZXR1cm4gaX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1
cm49CiJIaXN0b3J5KCIrdGhpcy5nZXQoImlkIikrIiwiK3RoaXMuZ2V0KCJuYW1lIikrIikifX0p
O2QuVVBEQVRFX0RFTEFZPTNENDAwMD0KO2QuZ2V0SGlzdG9yeURhdGE9M0RmdW5jdGlvbiBlKGcs
cSl7cT0zRHF8fHt9O3ZhciBrPTNEcS5oZGFEZXRhaWxJZHN8fFtdO3ZhPQpyIG09M0RqUXVlcnku
RGVmZXJyZWQoKSxsPTNEbnVsbDtmdW5jdGlvbiBoKHIpe3JldHVybiBqUXVlcnkuYWpheChnYWxh
eHlfY289Cm5maWcucm9vdCsiYXBpL2hpc3Rvcmllcy8iK2cpfWZ1bmN0aW9uIGYocil7aWYoIXJ8
fCFyLnN0YXRlX2lkcyl7cmV0dXJuIDB9cj0KZXR1cm4gXy5yZWR1Y2Uoci5zdGF0ZV9pZHMsZnVu
Y3Rpb24ocyx1LHQpe3JldHVybiBzK3UubGVuZ3RofSwwKX1mdW5jdGlvbiBwPQoocyl7aWYoIWYo
cykpe3JldHVybltdfWlmKF8uaXNGdW5jdGlvbihrKSl7az0zRGsocyl9dmFyIHI9M0Qoay5sZW5n
dGgpPyh7ZGU9CnRhaWxzOmsuam9pbigiLCIpfSk6KHt9KTtyZXR1cm4galF1ZXJ5LmFqYXgoZ2Fs
YXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaT0KZXMvIitzLmlkKyIvY29udGVudHMiLHtkYXRh
OnJ9KX12YXIgbz0zRHEuaGlzdG9yeUZufHxoLG49M0RxLmhkYUZufHxwO3ZhciBqPQo9M0RvKGcp
O2ouZG9uZShmdW5jdGlvbihyKXtsPTNEcjttLm5vdGlmeSh7c3RhdHVzOiJoaXN0b3J5IGRhdGEg
cmV0cmlldmVkIiw9Cmhpc3RvcnlKU09OOmx9KX0pO2ouZmFpbChmdW5jdGlvbih0LHIscyl7bS5y
ZWplY3QodCwibG9hZGluZyB0aGUgaGlzdG9yeSIpfT0KKTt2YXIgaT0zRGoudGhlbihuKTtpLnRo
ZW4oZnVuY3Rpb24ocil7bS5ub3RpZnkoe3N0YXR1czoiZGF0YXNldCBkYXRhIHJldHJpPQpldmVk
IixoaXN0b3J5SlNPTjpsLGhkYUpTT046cn0pO20ucmVzb2x2ZShsLHIpfSk7aS5mYWlsKGZ1bmN0
aW9uKHQscixzKXttLnI9CmVqZWN0KHQsImxvYWRpbmcgdGhlIGRhdGFzZXRzIix7aGlzdG9yeTps
fSl9KTtyZXR1cm4gbX07dmFyIGM9M0RCYWNrYm9uZS5Dbz0KbGxlY3Rpb24uZXh0ZW5kKGEuTG9n
Z2FibGVNaXhpbikuZXh0ZW5kKHttb2RlbDpkLHVybFJvb3Q6Z2FsYXh5X2NvbmZpZy5yb290PQor
ImFwaS9oaXN0b3JpZXMifSk7cmV0dXJue0hpc3Rvcnk6ZCxIaXN0b3J5Q29sbGVjdGlvbjpjfX0p
OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2RlZmluZShbIm12Yy9kYXRhc2V0L2hkYS1t
b2RlbCIsIm12Yy9iYXNlLW12YyIsInV0aWxzL2xvY2FsaXphdGlvbiJdLGZ1bmN0PQppb24oYyxh
LGIpe3ZhciBlPTNEQmFja2JvbmUuTW9kZWwuZXh0ZW5kKGEuTG9nZ2FibGVNaXhpbikuZXh0ZW5k
KHtkZWZhdWx0czo9Cnttb2RlbF9jbGFzczoiSGlzdG9yeSIsaWQ6bnVsbCxuYW1lOiJVbm5hbWVk
IEhpc3RvcnkiLHN0YXRlOiJuZXciLGRpc2tTaXplOj0KMCxkZWxldGVkOmZhbHNlfSx1cmxSb290
OmdhbGF4eV9jb25maWcucm9vdCsiYXBpL2hpc3RvcmllcyIscmVuYW1lVXJsOmZ1bmN0PQppb24o
KXt2YXIgZz0zRHRoaXMuZ2V0KCJpZCIpO2lmKCFnKXtyZXR1cm4gdW5kZWZpbmVkfXJldHVybiBn
YWxheHlfY29uZmlnLnI9Cm9vdCsiaGlzdG9yeS9yZW5hbWVfYXN5bmM/aWQ9M0QiK3RoaXMuZ2V0
KCJpZCIpfSxhbm5vdGF0ZVVybDpmdW5jdGlvbigpe3Zhcj0KIGc9M0R0aGlzLmdldCgiaWQiKTtp
ZighZyl7cmV0dXJuIHVuZGVmaW5lZH1yZXR1cm4gZ2FsYXh5X2NvbmZpZy5yb290KyJoaXN0PQpv
cnkvYW5ub3RhdGVfYXN5bmM/aWQ9M0QiK3RoaXMuZ2V0KCJpZCIpfSx0YWdVcmw6ZnVuY3Rpb24o
KXt2YXIgZz0zRHRoaXMuZ2U9CnQoImlkIik7aWYoIWcpe3JldHVybiB1bmRlZmluZWR9cmV0dXJu
IGdhbGF4eV9jb25maWcucm9vdCsidGFnL2dldF90YWdnaW5nXz0KZWx0X2FzeW5jP2l0ZW1faWQ9
M0QiK3RoaXMuZ2V0KCJpZCIpKyImaXRlbV9jbGFzcz0zREhpc3RvcnkifSxpbml0aWFsaXplOmZ1
PQpuY3Rpb24oaCxpLGcpe2c9M0RnfHx7fTt0aGlzLmxvZ2dlcj0zRGcubG9nZ2VyfHxudWxsO3Ro
aXMubG9nKHRoaXMrIi5pbml0aWE9CmxpemU6IixoLGksZyk7dGhpcy5oZGFzPTNEbmV3IGMuSERB
Q29sbGVjdGlvbihpfHxbXSx7aGlzdG9yeUlkOnRoaXMuZ2V0KCJpZD0KIil9KTtpZihpJiZfLmlz
QXJyYXkoaSkpe3RoaXMuaGRhcy5yZXNldChpKX10aGlzLl9zZXRVcExpc3RlbmVycygpO3RoaXMu
dXBkPQphdGVUaW1lb3V0SWQ9M0RudWxsfSxfc2V0VXBMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlz
Lm9uKCJlcnJvciIsZnVuY3Rpb24oaCw9CmssZyxqLGkpe3RoaXMuZXJyb3JIYW5kbGVyKGgsayxn
LGosaSl9KTtpZih0aGlzLmhkYXMpe3RoaXMubGlzdGVuVG8odGhpcy5oZD0KYXMsImVycm9yIixm
dW5jdGlvbigpe3RoaXMudHJpZ2dlci5hcHBseSh0aGlzLFsiZXJyb3I6aGRhcyJdLmNvbmNhdChq
UXVlcnkuPQptYWtlQXJyYXkoYXJndW1lbnRzKSkpfSl9dGhpcy5vbigiY2hhbmdlOmlkIixmdW5j
dGlvbihoLGcpe2lmKHRoaXMuaGRhcyl7dGg9CmlzLmhkYXMuaGlzdG9yeUlkPTNEZ319LHRoaXMp
fSxlcnJvckhhbmRsZXI6ZnVuY3Rpb24oaCxrLGcsaixpKXt0aGlzLmNsZWFyVT0KcGRhdGVUaW1l
b3V0KCl9LG93bmVkQnlDdXJyVXNlcjpmdW5jdGlvbigpe2lmKCFHYWxheHl8fCFHYWxheHkuY3Vy
clVzZXIpe3JlPQp0dXJuIGZhbHNlfWlmKEdhbGF4eS5jdXJyVXNlci5pc0Fub255bW91cygpfHxH
YWxheHkuY3VyclVzZXIuaWQhPTNEPTNEdGhpcy49CmdldCgidXNlcl9pZCIpKXtyZXR1cm4gZmFs
c2V9cmV0dXJuIHRydWV9LGhkYUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIF8ucmVkdT0KY2UoXy52
YWx1ZXModGhpcy5nZXQoInN0YXRlX2RldGFpbHMiKSksZnVuY3Rpb24oZyxoKXtyZXR1cm4gZyto
fSwwKX0sY2hlY2tGPQpvclVwZGF0ZXM6ZnVuY3Rpb24oZyl7aWYodGhpcy5oZGFzLnJ1bm5pbmco
KS5sZW5ndGgpe3RoaXMuc2V0VXBkYXRlVGltZW91dCg9Cil9ZWxzZXt0aGlzLnRyaWdnZXIoInJl
YWR5Iik7aWYoXy5pc0Z1bmN0aW9uKGcpKXtnLmNhbGwodGhpcyl9fXJldHVybiB0aGlzfT0KLHNl
dFVwZGF0ZVRpbWVvdXQ6ZnVuY3Rpb24oZyl7Zz0zRGd8fGUuVVBEQVRFX0RFTEFZO3ZhciBoPTNE
dGhpczt0aGlzLmNsZWFyPQpVcGRhdGVUaW1lb3V0KCk7dGhpcy51cGRhdGVUaW1lb3V0SWQ9M0Rz
ZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5yZWZyZXNoKCl9LGc9Cik7cmV0dXJuIHRoaXMudXBkYXRl
VGltZW91dElkfSxjbGVhclVwZGF0ZVRpbWVvdXQ6ZnVuY3Rpb24oKXtpZih0aGlzLnVwZGF0ZT0K
VGltZW91dElkKXtjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0SWQpO3RoaXMudXBkYXRl
VGltZW91dElkPTNEbnVsbH19PQoscmVmcmVzaDpmdW5jdGlvbihoLGcpe2g9M0RofHxbXTtnPTNE
Z3x8e307dmFyIGk9M0R0aGlzO2cuZGF0YT0zRGcuZGF0YXx8e309CjtpZihoLmxlbmd0aCl7Zy5k
YXRhLmRldGFpbHM9M0RoLmpvaW4oIiwiKX12YXIgaj0zRHRoaXMuaGRhcy5mZXRjaChnKTtqLmRv
bj0KZShmdW5jdGlvbihrKXtpLmNoZWNrRm9yVXBkYXRlcyhmdW5jdGlvbigpe3RoaXMuZmV0Y2go
KX0pfSk7cmV0dXJuIGp9LHRvU3RyPQppbmc6ZnVuY3Rpb24oKXtyZXR1cm4iSGlzdG9yeSgiK3Ro
aXMuZ2V0KCJpZCIpKyIsIit0aGlzLmdldCgibmFtZSIpKyIpIn19KTs9CmUuVVBEQVRFX0RFTEFZ
PTNENDAwMDtlLmdldEhpc3RvcnlEYXRhPTNEZnVuY3Rpb24gZihoLHIpe3I9M0RyfHx7fTt2YXIg
bD0zRD0Kci5oZGFEZXRhaWxJZHN8fFtdO3ZhciBuPTNEalF1ZXJ5LkRlZmVycmVkKCksbT0zRG51
bGw7ZnVuY3Rpb24gaShzKXtyZXR1cm4gPQpqUXVlcnkuYWpheChnYWxheHlfY29uZmlnLnJvb3Qr
ImFwaS9oaXN0b3JpZXMvIitoKX1mdW5jdGlvbiBnKHMpe2lmKCFzfHwhcy49CnN0YXRlX2lkcyl7
cmV0dXJuIDB9cmV0dXJuIF8ucmVkdWNlKHMuc3RhdGVfaWRzLGZ1bmN0aW9uKHQsdix1KXtyZXR1
cm4gdCt2Lj0KbGVuZ3RofSwwKX1mdW5jdGlvbiBxKHQpe2lmKCFnKHQpKXtyZXR1cm5bXX1pZihf
LmlzRnVuY3Rpb24obCkpe2w9M0RsKHQpfXZhPQpyIHM9M0QobC5sZW5ndGgpPyh7ZGV0YWlsczps
LmpvaW4oIiwiKX0pOih7fSk7cmV0dXJuIGpRdWVyeS5hamF4KGdhbGF4eV9jb249CmZpZy5yb290
KyJhcGkvaGlzdG9yaWVzLyIrdC5pZCsiL2NvbnRlbnRzIix7ZGF0YTpzfSl9dmFyIHA9M0RyLmhp
c3RvcnlGbnx8aT0KLG89M0RyLmhkYUZufHxxO3ZhciBrPTNEcChoKTtrLmRvbmUoZnVuY3Rpb24o
cyl7bT0zRHM7bi5ub3RpZnkoe3N0YXR1czoiaGlzPQp0b3J5IGRhdGEgcmV0cmlldmVkIixoaXN0
b3J5SlNPTjptfSl9KTtrLmZhaWwoZnVuY3Rpb24odSxzLHQpe24ucmVqZWN0KHUsImw9Cm9hZGlu
ZyB0aGUgaGlzdG9yeSIpfSk7dmFyIGo9M0RrLnRoZW4obyk7ai50aGVuKGZ1bmN0aW9uKHMpe24u
bm90aWZ5KHtzdGF0dT0KczoiZGF0YXNldCBkYXRhIHJldHJpZXZlZCIsaGlzdG9yeUpTT046bSxo
ZGFKU09OOnN9KTtuLnJlc29sdmUobSxzKX0pO2ouZmFpPQpsKGZ1bmN0aW9uKHUscyx0KXtuLnJl
amVjdCh1LCJsb2FkaW5nIHRoZSBkYXRhc2V0cyIse2hpc3Rvcnk6bX0pfSk7cmV0dXJuIG49Cn07
dmFyIGQ9M0RCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZChhLkxvZ2dhYmxlTWl4aW4pLmV4dGVu
ZCh7bW9kZWw6ZSx1cmxSbz0Kb3Q6Z2FsYXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaWVzIn0p
O3JldHVybntIaXN0b3J5OmUsSGlzdG9yeUNvbGxlY3Rpb246PQpkfX0pOwpcIE5vIG5ld2xpbmUg
YXQgZW5kIG9mIGZpbGUKCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3OWEwYmE4
OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJjYjIgc3Rh
dGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktcGFuZWwuanMKLS0tIGEvc3Rh
dGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktcGFuZWwuanMKKysrIGIvc3Rh
dGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktcGFuZWwuanMKQEAgLTEsMSAr
MSwxIEBACi1kZWZpbmUoWyJtdmMvZGF0YXNldC9oZGEtbW9kZWwiLCJtdmMvZGF0YXNldC9oZGEt
ZWRpdCIsIm12Yy9oaXN0b3J5L3JlYWRvbj0KbHktaGlzdG9yeS1wYW5lbCIsIm12Yy90YWdzIiwi
bXZjL2Fubm90YXRpb25zIl0sZnVuY3Rpb24oZSxiLGQsYSxjKXt2YXIgZj0KPTNEZC5SZWFkT25s
eUhpc3RvcnlQYW5lbC5leHRlbmQoe0hEQVZpZXdDbGFzczpiLkhEQUVkaXRWaWV3LGluaXRpYWxp
emU6ZnVuPQpjdGlvbihnKXtnPTNEZ3x8e307dGhpcy5zZWxlY3RlZEhkYUlkcz0zRFtdO3RoaXMu
dGFnc0VkaXRvcj0zRG51bGw7dGhpcy5hbm49Cm90YXRpb25FZGl0b3I9M0RudWxsO3RoaXMuc2Vs
ZWN0aW5nPTNEZy5zZWxlY3Rpbmd8fGZhbHNlO3RoaXMuYW5ub3RhdGlvbkVkaT0KdG9yU2hvd249
M0RnLmFubm90YXRpb25FZGl0b3JTaG93bnx8ZmFsc2U7dGhpcy50YWdzRWRpdG9yU2hvd249M0Rn
LnRhZ3NFZGl0PQpvclNob3dufHxmYWxzZTtkLlJlYWRPbmx5SGlzdG9yeVBhbmVsLnByb3RvdHlw
ZS5pbml0aWFsaXplLmNhbGwodGhpcyxnKX0sX3M9CmV0VXBNb2RlbEV2ZW50SGFuZGxlcnM6ZnVu
Y3Rpb24oKXtkLlJlYWRPbmx5SGlzdG9yeVBhbmVsLnByb3RvdHlwZS5fc2V0VXBNbz0KZGVsRXZl
bnRIYW5kbGVycy5jYWxsKHRoaXMpO3RoaXMubW9kZWwub24oImNoYW5nZTpuaWNlX3NpemUiLHRo
aXMudXBkYXRlSGlzPQp0b3J5RGlza1NpemUsdGhpcyk7dGhpcy5tb2RlbC5oZGFzLm9uKCJjaGFu
Z2U6ZGVsZXRlZCIsdGhpcy5faGFuZGxlSGRhRGVsZXQ9CmlvbkNoYW5nZSx0aGlzKTt0aGlzLm1v
ZGVsLmhkYXMub24oImNoYW5nZTp2aXNpYmxlIix0aGlzLl9oYW5kbGVIZGFWaXNpYmxlQz0KaGFu
Z2UsdGhpcyk7dGhpcy5tb2RlbC5oZGFzLm9uKCJjaGFuZ2U6cHVyZ2VkIixmdW5jdGlvbihnKXt0
aGlzLm1vZGVsLmZldGNoPQooKX0sdGhpcyl9LHJlbmRlck1vZGVsOmZ1bmN0aW9uKCl7dmFyIGc9
M0QkKCI8ZGl2Lz4iKTtnLmFwcGVuZChmLnRlbXBsYXRlcy49Cmhpc3RvcnlQYW5lbCh0aGlzLm1v
ZGVsLnRvSlNPTigpKSk7dGhpcy4kZW1wdHlNZXNzYWdlKGcpLnRleHQodGhpcy5lbXB0eU1zZz0K
KTtpZihHYWxheHkmJkdhbGF4eS5jdXJyVXNlciYmR2FsYXh5LmN1cnJVc2VyLmlkJiZHYWxheHku
Y3VyclVzZXIuaWQ9M0Q9M0Q9Cj0zRHRoaXMubW9kZWwuZ2V0KCJ1c2VyX2lkIikpe3RoaXMuX3Jl
bmRlclRhZ3MoZyk7dGhpcy5fcmVuZGVyQW5ub3RhdGlvbihnKT0KfWcuZmluZCgiLmhpc3Rvcnkt
c2Vjb25kYXJ5LWFjdGlvbnMiKS5wcmVwZW5kKHRoaXMuX3JlbmRlclNlbGVjdEJ1dHRvbigpKTtn
PQouZmluZCgiLmhpc3RvcnktZGF0YXNldC1hY3Rpb25zIikudG9nZ2xlKHRoaXMuc2VsZWN0aW5n
KTtnLmZpbmQoIi5oaXN0b3J5LXM9CmVjb25kYXJ5LWFjdGlvbnMiKS5wcmVwZW5kKHRoaXMuX3Jl
bmRlclNlYXJjaEJ1dHRvbigpKTt0aGlzLl9zZXRVcEJlaGF2aW91cj0KcyhnKTt0aGlzLnJlbmRl
ckhkYXMoZyk7cmV0dXJuIGd9LF9yZW5kZXJUYWdzOmZ1bmN0aW9uKGcpe3ZhciBoPTNEdGhpczt0
aGlzPQoudGFnc0VkaXRvcj0zRG5ldyBhLlRhZ3NFZGl0b3Ioe21vZGVsOnRoaXMubW9kZWwsZWw6
Zy5maW5kKCIuaGlzdG9yeS1jb250cm89CmxzIC50YWdzLWRpc3BsYXkiKSxvbnNob3dGaXJzdFRp
bWU6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfSxvbnNob3c6ZnVuY3Rpbz0Kbigpe2gudG9nZ2xl
SERBVGFnRWRpdG9ycyh0cnVlLGguZnhTcGVlZCl9LG9uaGlkZTpmdW5jdGlvbigpe2gudG9nZ2xl
SERBVGFnPQpFZGl0b3JzKGZhbHNlLGguZnhTcGVlZCl9LCRhY3RpdmF0b3I6ZmFJY29uQnV0dG9u
KHt0aXRsZTpfbCgiRWRpdCBoaXN0b3J5IHQ9CmFncyIpLGNsYXNzZXM6Imhpc3RvcnktdGFnLWJ0
biIsZmFJY29uOiJmYS10YWdzIn0pLmFwcGVuZFRvKGcuZmluZCgiLmhpc3Rvcj0KeS1zZWNvbmRh
cnktYWN0aW9ucyIpKX0pfSxfcmVuZGVyQW5ub3RhdGlvbjpmdW5jdGlvbihnKXt2YXIgaD0zRHRo
aXM7dGhpcy5hPQpubm90YXRpb25FZGl0b3I9M0RuZXcgYy5Bbm5vdGF0aW9uRWRpdG9yKHttb2Rl
bDp0aGlzLm1vZGVsLGVsOmcuZmluZCgiLmhpc3Q9Cm9yeS1jb250cm9scyAuYW5ub3RhdGlvbi1k
aXNwbGF5Iiksb25zaG93Rmlyc3RUaW1lOmZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKT0KfSxvbnNo
b3c6ZnVuY3Rpb24oKXtoLnRvZ2dsZUhEQUFubm90YXRpb25FZGl0b3JzKHRydWUsaC5meFNwZWVk
KX0sb25oaWRlOmZ1PQpuY3Rpb24oKXtoLnRvZ2dsZUhEQUFubm90YXRpb25FZGl0b3JzKGZhbHNl
LGguZnhTcGVlZCl9LCRhY3RpdmF0b3I6ZmFJY29uQnU9CnR0b24oe3RpdGxlOl9sKCJFZGl0IGhp
c3RvcnkgQW5ub3RhdGlvbiIpLGNsYXNzZXM6Imhpc3RvcnktYW5ub3RhdGUtYnRuIixmYT0KSWNv
bjoiZmEtY29tbWVudCJ9KS5hcHBlbmRUbyhnLmZpbmQoIi5oaXN0b3J5LXNlY29uZGFyeS1hY3Rp
b25zIikpfSl9LF9yZW5kPQplclNlbGVjdEJ1dHRvbjpmdW5jdGlvbihnKXtyZXR1cm4gZmFJY29u
QnV0dG9uKHt0aXRsZTpfbCgiT3BlcmF0aW9ucyBvbiBtdWw9CnRpcGxlIGRhdGFzZXRzIiksY2xh
c3NlczoiaGlzdG9yeS1zZWxlY3QtYnRuIixmYUljb246ImZhLWNoZWNrLXNxdWFyZS1vIn0pfT0K
LF9zZXRVcEJlaGF2aW91cnM6ZnVuY3Rpb24oZyl7Zz0zRGd8fHRoaXMuJGVsO2QuUmVhZE9ubHlI
aXN0b3J5UGFuZWwucHJvdG90PQp5cGUuX3NldFVwQmVoYXZpb3Vycy5jYWxsKHRoaXMsZyk7aWYo
IXRoaXMubW9kZWwpe3JldHVybn10aGlzLl9zZXRVcERhdGFzZXQ9CkFjdGlvbnNQb3B1cChnKTtp
ZigoIUdhbGF4eS5jdXJyVXNlcnx8R2FsYXh5LmN1cnJVc2VyLmlzQW5vbnltb3VzKCkpfHwoR2Fs
YT0KeHkuY3VyclVzZXIuaWQhPTNEPTNEdGhpcy5tb2RlbC5nZXQoInVzZXJfaWQiKSkpe3JldHVy
bn12YXIgaD0zRHRoaXM7Zy5maW5kPQooIi5oaXN0b3J5LW5hbWUiKS5hdHRyKCJ0aXRsZSIsX2wo
IkNsaWNrIHRvIHJlbmFtZSBoaXN0b3J5IikpLnRvb2x0aXAoe3BsYWM9CmVtZW50OiJib3R0b20i
fSkubWFrZV90ZXh0X2VkaXRhYmxlKHtvbl9maW5pc2g6ZnVuY3Rpb24oaSl7dmFyIGo9M0RoLm1v
ZGVsLj0KZ2V0KCJuYW1lIik7aWYoaSYmaSE9M0Q9M0RqKXtoLiRlbC5maW5kKCIuaGlzdG9yeS1u
YW1lIikudGV4dChpKTtoLm1vZGVsLnNhPQp2ZSh7bmFtZTppfSkuZmFpbChmdW5jdGlvbigpe2gu
JGVsLmZpbmQoIi5oaXN0b3J5LW5hbWUiKS50ZXh0KGgubW9kZWwucHJldmk9Cm91cygibmFtZSIp
KX0pfWVsc2V7aC4kZWwuZmluZCgiLmhpc3RvcnktbmFtZSIpLnRleHQoail9fX0pfSxfc2V0VXBE
YXRhc2V0QT0KY3Rpb25zUG9wdXA6ZnVuY3Rpb24oZyl7dmFyIGg9M0R0aGlzOyhuZXcgUG9wdXBN
ZW51KGcuZmluZCgiLmhpc3RvcnktZGF0YXNlPQp0LWFjdGlvbi1wb3B1cC1idG4iKSxbe2h0bWw6
X2woIkhpZGUgZGF0YXNldHMiKSxmdW5jOmZ1bmN0aW9uKCl7dmFyIGk9M0RlLkg9CmlzdG9yeURh
dGFzZXRBc3NvY2lhdGlvbi5wcm90b3R5cGUuaGlkZTtoLmdldFNlbGVjdGVkSGRhQ29sbGVjdGlv
bigpLmFqYXhRdT0KZXVlKGkpfX0se2h0bWw6X2woIlVuaGlkZSBkYXRhc2V0cyIpLGZ1bmM6ZnVu
Y3Rpb24oKXt2YXIgaT0zRGUuSGlzdG9yeURhdGFzPQpldEFzc29jaWF0aW9uLnByb3RvdHlwZS51
bmhpZGU7aC5nZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKS5hamF4UXVldWUoaSl9fSw9CntodG1s
Ol9sKCJEZWxldGUgZGF0YXNldHMiKSxmdW5jOmZ1bmN0aW9uKCl7dmFyIGk9M0RlLkhpc3RvcnlE
YXRhc2V0QXNzb2NpYT0KdGlvbi5wcm90b3R5cGVbImRlbGV0ZSJdO2guZ2V0U2VsZWN0ZWRIZGFD
b2xsZWN0aW9uKCkuYWpheFF1ZXVlKGkpfX0se2h0bWw6PQpfbCgiVW5kZWxldGUgZGF0YXNldHMi
KSxmdW5jOmZ1bmN0aW9uKCl7dmFyIGk9M0RlLkhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb249Ci5w
cm90b3R5cGUudW5kZWxldGU7aC5nZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKS5hamF4UXVldWUo
aSl9fSx7aHRtbDpfbCgiUD0KZXJtYW5lbnRseSBkZWxldGUgZGF0YXNldHMiKSxmdW5jOmZ1bmN0
aW9uKCl7aWYoY29uZmlybShfbCgiVGhpcyB3aWxsIHBlcm1hPQpuZW50bHkgcmVtb3ZlIHRoZSBk
YXRhIGluIHlvdXIgZGF0YXNldHMuIEFyZSB5b3Ugc3VyZT8iKSkpe3ZhciBpPTNEZS5IaXN0b3I9
CnlEYXRhc2V0QXNzb2NpYXRpb24ucHJvdG90eXBlLnB1cmdlO2guZ2V0U2VsZWN0ZWRIZGFDb2xs
ZWN0aW9uKCkuYWpheFF1ZXVlKD0KaSl9fX1dKSl9LF9oYW5kbGVIZGFEZWxldGlvbkNoYW5nZTpm
dW5jdGlvbihnKXtpZihnLmdldCgiZGVsZXRlZCIpJiYhdGhpcy5zPQp0b3JhZ2UuZ2V0KCJzaG93
X2RlbGV0ZWQiKSl7dGhpcy5yZW1vdmVIZGFWaWV3KHRoaXMuaGRhVmlld3NbZy5pZF0pfX0sX2hh
bmQ9CmxlSGRhVmlzaWJsZUNoYW5nZTpmdW5jdGlvbihnKXtpZihnLmhpZGRlbigpJiYhdGhpcy5z
dG9yYWdlLmdldCgic2hvd19oaWRkZT0KbiIpKXt0aGlzLnJlbW92ZUhkYVZpZXcodGhpcy5oZGFW
aWV3c1tnLmlkXSl9fSxfY3JlYXRlSGRhVmlldzpmdW5jdGlvbihoKXt2PQphciBnPTNEaC5nZXQo
ImlkIiksaT0zRG5ldyB0aGlzLkhEQVZpZXdDbGFzcyh7bW9kZWw6aCxsaW5rVGFyZ2V0OnRoaXMu
bGlua1Q9CmFyZ2V0LGV4cGFuZGVkOnRoaXMuc3RvcmFnZS5nZXQoImV4cGFuZGVkSGRhcyIpW2dd
LHNlbGVjdGFibGU6dGhpcy5zZWxlY3Rpbj0KZyxoYXNVc2VyOnRoaXMubW9kZWwub3duZWRCeUN1
cnJVc2VyKCksbG9nZ2VyOnRoaXMubG9nZ2VyLHRhZ3NFZGl0b3JTaG93bjooPQp0aGlzLnRhZ3NF
ZGl0b3ImJiF0aGlzLnRhZ3NFZGl0b3IuaGlkZGVuKSxhbm5vdGF0aW9uRWRpdG9yU2hvd246KHRo
aXMuYW5ub3Q9CmF0aW9uRWRpdG9yJiYhdGhpcy5hbm5vdGF0aW9uRWRpdG9yLmhpZGRlbil9KTt0
aGlzLl9zZXRVcEhkYUxpc3RlbmVycyhpKTtyZT0KdHVybiBpfSxfc2V0VXBIZGFMaXN0ZW5lcnM6
ZnVuY3Rpb24oaCl7dmFyIGc9M0R0aGlzO2QuUmVhZE9ubHlIaXN0b3J5UGFuZWwuPQpwcm90b3R5
cGUuX3NldFVwSGRhTGlzdGVuZXJzLmNhbGwodGhpcyxoKTtoLm9uKCJzZWxlY3RlZCIsZnVuY3Rp
b24oaSl7dmFyIGo9Cj0zRGkubW9kZWwuZ2V0KCJpZCIpO2cuc2VsZWN0ZWRIZGFJZHM9M0RfLnVu
aW9uKGcuc2VsZWN0ZWRIZGFJZHMsW2pdKX0pO2gubz0KbigiZGUtc2VsZWN0ZWQiLGZ1bmN0aW9u
KGkpe3ZhciBqPTNEaS5tb2RlbC5nZXQoImlkIik7Zy5zZWxlY3RlZEhkYUlkcz0zRF8uPQp3aXRo
b3V0KGcuc2VsZWN0ZWRIZGFJZHMsail9KX0sdG9nZ2xlSERBVGFnRWRpdG9yczpmdW5jdGlvbihn
KXt2YXIgaD0zRGFyZ3U9Cm1lbnRzO18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGkpe2lm
KGkudGFnc0VkaXRvcil7aS50YWdzRWRpdG9yLnRvZ2dsZT0KLmFwcGx5KGkudGFnc0VkaXRvcixo
KX19KX0sdG9nZ2xlSERBQW5ub3RhdGlvbkVkaXRvcnM6ZnVuY3Rpb24oZyl7dmFyIGg9M0RhPQpy
Z3VtZW50cztfLmVhY2godGhpcy5oZGFWaWV3cyxmdW5jdGlvbihpKXtpZihpLmFubm90YXRpb25F
ZGl0b3Ipe2kuYW5ub3RhdGk9Cm9uRWRpdG9yLnRvZ2dsZS5hcHBseShpLmFubm90YXRpb25FZGl0
b3IsaCl9fSl9LHJlbW92ZUhkYVZpZXc6ZnVuY3Rpb24oaCl7aT0KZighaCl7cmV0dXJufXZhciBn
PTNEdGhpcztoLiRlbC5mYWRlT3V0KGcuZnhTcGVlZCxmdW5jdGlvbigpe2gub2ZmKCk7aC5yZW1v
PQp2ZSgpO2RlbGV0ZSBnLmhkYVZpZXdzW2gubW9kZWwuaWRdO2lmKF8uaXNFbXB0eShnLmhkYVZp
ZXdzKSl7Zy4kZW1wdHlNZXNzYWc9CmUoKS5mYWRlSW4oZy5meFNwZWVkLGZ1bmN0aW9uKCl7Zy50
cmlnZ2VyKCJlbXB0eS1oaXN0b3J5IixnKX0pfX0pfSxldmVudHM6Xz0KLmV4dGVuZChfLmNsb25l
KGQuUmVhZE9ubHlIaXN0b3J5UGFuZWwucHJvdG90eXBlLmV2ZW50cykseyJjbGljayAuaGlzdG9y
eS1zPQplbGVjdC1idG4iOiJ0b2dnbGVTZWxlY3RvcnMiLCJjbGljayAuaGlzdG9yeS1zZWxlY3Qt
YWxsLWRhdGFzZXRzLWJ0biI6InNlbGU9CmN0QWxsRGF0YXNldHMiLCJjbGljayAuaGlzdG9yeS1k
ZXNlbGVjdC1hbGwtZGF0YXNldHMtYnRuIjoiZGVzZWxlY3RBbGxEYXRhcz0KZXRzIn0pLHVwZGF0
ZUhpc3RvcnlEaXNrU2l6ZTpmdW5jdGlvbigpe3RoaXMuJGVsLmZpbmQoIi5oaXN0b3J5LXNpemUi
KS50ZXh0PQoodGhpcy5tb2RlbC5nZXQoIm5pY2Vfc2l6ZSIpKX0sc2hvd1NlbGVjdG9yczpmdW5j
dGlvbihnKXtnPTNEKGchPTNEPTNEdW5kZWY9CmluZWQpPyhnKToodGhpcy5meFNwZWVkKTt0aGlz
LnNlbGVjdGluZz0zRHRydWU7dGhpcy4kKCIuaGlzdG9yeS1kYXRhc2V0LWFjdD0KaW9ucyIpLnNs
aWRlRG93bihnKTtfLmVhY2godGhpcy5oZGFWaWV3cyxmdW5jdGlvbihoKXtoLnNob3dTZWxlY3Rv
cigpfSk7dGhpPQpzLnNlbGVjdGVkSGRhSWRzPTNEW119LGhpZGVTZWxlY3RvcnM6ZnVuY3Rpb24o
Zyl7Zz0zRChnIT0zRD0zRHVuZGVmaW5lZCk/KGc9Cik6KHRoaXMuZnhTcGVlZCk7dGhpcy5zZWxl
Y3Rpbmc9M0RmYWxzZTt0aGlzLiQoIi5oaXN0b3J5LWRhdGFzZXQtYWN0aW9ucyIpLj0Kc2xpZGVV
cChnKTtfLmVhY2godGhpcy5oZGFWaWV3cyxmdW5jdGlvbihoKXtoLmhpZGVTZWxlY3RvcigpfSk7
dGhpcy5zZWxlY3RlPQpkSGRhSWRzPTNEW119LHRvZ2dsZVNlbGVjdG9yczpmdW5jdGlvbigpe2lm
KCF0aGlzLnNlbGVjdGluZyl7dGhpcy5zaG93U2VsZWM9CnRvcnMoKX1lbHNle3RoaXMuaGlkZVNl
bGVjdG9ycygpfX0sc2VsZWN0QWxsRGF0YXNldHM6ZnVuY3Rpb24oZyl7Xy5lYWNoKHRoaT0Kcy5o
ZGFWaWV3cyxmdW5jdGlvbihoKXtoLnNlbGVjdChnKX0pfSxkZXNlbGVjdEFsbERhdGFzZXRzOmZ1
bmN0aW9uKGcpe18uZWFjPQpoKHRoaXMuaGRhVmlld3MsZnVuY3Rpb24oaCl7aC5kZXNlbGVjdChn
KX0pfSxnZXRTZWxlY3RlZEhkYVZpZXdzOmZ1bmN0aW9uKCk9CntyZXR1cm4gXy5maWx0ZXIodGhp
cy5oZGFWaWV3cyxmdW5jdGlvbihnKXtyZXR1cm4gZy5zZWxlY3RlZH0pfSxnZXRTZWxlY3RlZD0K
SGRhQ29sbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcgZS5IREFDb2xsZWN0aW9uKF8ubWFw
KHRoaXMuZ2V0U2VsZWN0ZWRIPQpkYVZpZXdzKCksZnVuY3Rpb24oZyl7cmV0dXJuIGcubW9kZWx9
KSx7aGlzdG9yeUlkOnRoaXMubW9kZWwuaWR9KX0sdG9TdHJpbmc9CjpmdW5jdGlvbigpe3JldHVy
biJIaXN0b3J5UGFuZWwoIisoKHRoaXMubW9kZWwpPyh0aGlzLm1vZGVsLmdldCgibmFtZSIpKToo
Ij0KIikpKyIpIn19KTtyZXR1cm57SGlzdG9yeVBhbmVsOmZ9fSk7ClwgTm8gbmV3bGluZSBhdCBl
bmQgb2YgZmlsZQorZGVmaW5lKFsibXZjL2RhdGFzZXQvaGRhLW1vZGVsIiwibXZjL2RhdGFzZXQv
aGRhLWVkaXQiLCJtdmMvaGlzdG9yeS9yZWFkb249Cmx5LWhpc3RvcnktcGFuZWwiLCJtdmMvdGFn
cyIsIm12Yy9hbm5vdGF0aW9ucyIsInV0aWxzL2xvY2FsaXphdGlvbiJdLGZ1bmN0aT0Kb24oZixi
LGQsYSxjLGUpe3ZhciBnPTNEZC5SZWFkT25seUhpc3RvcnlQYW5lbC5leHRlbmQoe0hEQVZpZXdD
bGFzczpiLkhEQUVkPQppdFZpZXcsaW5pdGlhbGl6ZTpmdW5jdGlvbihoKXtoPTNEaHx8e307dGhp
cy5zZWxlY3RlZEhkYUlkcz0zRFtdO3RoaXMudGFnc0U9CmRpdG9yPTNEbnVsbDt0aGlzLmFubm90
YXRpb25FZGl0b3I9M0RudWxsO3RoaXMuc2VsZWN0aW5nPTNEaC5zZWxlY3Rpbmd8fGZhbD0Kc2U7
dGhpcy5hbm5vdGF0aW9uRWRpdG9yU2hvd249M0RoLmFubm90YXRpb25FZGl0b3JTaG93bnx8ZmFs
c2U7dGhpcy50YWdzRWRpPQp0b3JTaG93bj0zRGgudGFnc0VkaXRvclNob3dufHxmYWxzZTtkLlJl
YWRPbmx5SGlzdG9yeVBhbmVsLnByb3RvdHlwZS5pbml0aWE9CmxpemUuY2FsbCh0aGlzLGgpfSxf
c2V0VXBNb2RlbEV2ZW50SGFuZGxlcnM6ZnVuY3Rpb24oKXtkLlJlYWRPbmx5SGlzdG9yeVBhbj0K
ZWwucHJvdG90eXBlLl9zZXRVcE1vZGVsRXZlbnRIYW5kbGVycy5jYWxsKHRoaXMpO3RoaXMubW9k
ZWwub24oImNoYW5nZTpuaWNlPQpfc2l6ZSIsdGhpcy51cGRhdGVIaXN0b3J5RGlza1NpemUsdGhp
cyk7dGhpcy5tb2RlbC5oZGFzLm9uKCJjaGFuZ2U6ZGVsZXRlZCI9Cix0aGlzLl9oYW5kbGVIZGFE
ZWxldGlvbkNoYW5nZSx0aGlzKTt0aGlzLm1vZGVsLmhkYXMub24oImNoYW5nZTp2aXNpYmxlIix0
aD0KaXMuX2hhbmRsZUhkYVZpc2libGVDaGFuZ2UsdGhpcyk7dGhpcy5tb2RlbC5oZGFzLm9uKCJj
aGFuZ2U6cHVyZ2VkIixmdW5jdGlvPQpuKGgpe3RoaXMubW9kZWwuZmV0Y2goKX0sdGhpcyl9LHJl
bmRlck1vZGVsOmZ1bmN0aW9uKCl7dmFyIGg9M0QkKCI8ZGl2Lz4iKTs9CmguYXBwZW5kKGcudGVt
cGxhdGVzLmhpc3RvcnlQYW5lbCh0aGlzLm1vZGVsLnRvSlNPTigpKSk7dGhpcy4kZW1wdHlNZXNz
YWdlKD0KaCkudGV4dCh0aGlzLmVtcHR5TXNnKTtpZihHYWxheHkmJkdhbGF4eS5jdXJyVXNlciYm
R2FsYXh5LmN1cnJVc2VyLmlkJiZHYWxhPQp4eS5jdXJyVXNlci5pZD0zRD0zRD0zRHRoaXMubW9k
ZWwuZ2V0KCJ1c2VyX2lkIikpe3RoaXMuX3JlbmRlclRhZ3MoaCk7dGhpcy49Cl9yZW5kZXJBbm5v
dGF0aW9uKGgpfWguZmluZCgiLmhpc3Rvcnktc2Vjb25kYXJ5LWFjdGlvbnMiKS5wcmVwZW5kKHRo
aXMuX3Jlbj0KZGVyU2VsZWN0QnV0dG9uKCkpO2guZmluZCgiLmhpc3RvcnktZGF0YXNldC1hY3Rp
b25zIikudG9nZ2xlKHRoaXMuc2VsZWN0aW5nPQopO2guZmluZCgiLmhpc3Rvcnktc2Vjb25kYXJ5
LWFjdGlvbnMiKS5wcmVwZW5kKHRoaXMuX3JlbmRlclNlYXJjaEJ1dHRvbigpKTs9CnRoaXMuX3Nl
dFVwQmVoYXZpb3VycyhoKTt0aGlzLnJlbmRlckhkYXMoaCk7cmV0dXJuIGh9LF9yZW5kZXJUYWdz
OmZ1bmN0aW9uKD0KaCl7dmFyIGk9M0R0aGlzO3RoaXMudGFnc0VkaXRvcj0zRG5ldyBhLlRhZ3NF
ZGl0b3Ioe21vZGVsOnRoaXMubW9kZWwsZWw6aC5mPQppbmQoIi5oaXN0b3J5LWNvbnRyb2xzIC50
YWdzLWRpc3BsYXkiKSxvbnNob3dGaXJzdFRpbWU6ZnVuY3Rpb24oKXt0aGlzLnJlbmQ9CmVyKCl9
LG9uc2hvdzpmdW5jdGlvbigpe2kudG9nZ2xlSERBVGFnRWRpdG9ycyh0cnVlLGkuZnhTcGVlZCl9
LG9uaGlkZTpmdW5jdD0KaW9uKCl7aS50b2dnbGVIREFUYWdFZGl0b3JzKGZhbHNlLGkuZnhTcGVl
ZCl9LCRhY3RpdmF0b3I6ZmFJY29uQnV0dG9uKHt0aXRsPQplOmUoIkVkaXQgaGlzdG9yeSB0YWdz
IiksY2xhc3NlczoiaGlzdG9yeS10YWctYnRuIixmYUljb246ImZhLXRhZ3MifSkuYXBwZW49CmRU
byhoLmZpbmQoIi5oaXN0b3J5LXNlY29uZGFyeS1hY3Rpb25zIikpfSl9LF9yZW5kZXJBbm5vdGF0
aW9uOmZ1bmN0aW9uKGgpez0KdmFyIGk9M0R0aGlzO3RoaXMuYW5ub3RhdGlvbkVkaXRvcj0zRG5l
dyBjLkFubm90YXRpb25FZGl0b3Ioe21vZGVsOnRoaXMubW9kPQplbCxlbDpoLmZpbmQoIi5oaXN0
b3J5LWNvbnRyb2xzIC5hbm5vdGF0aW9uLWRpc3BsYXkiKSxvbnNob3dGaXJzdFRpbWU6ZnVuY3Q9
Cmlvbigpe3RoaXMucmVuZGVyKCl9LG9uc2hvdzpmdW5jdGlvbigpe2kudG9nZ2xlSERBQW5ub3Rh
dGlvbkVkaXRvcnModHJ1ZSxpLj0KZnhTcGVlZCl9LG9uaGlkZTpmdW5jdGlvbigpe2kudG9nZ2xl
SERBQW5ub3RhdGlvbkVkaXRvcnMoZmFsc2UsaS5meFNwZWVkKX0sPQokYWN0aXZhdG9yOmZhSWNv
bkJ1dHRvbih7dGl0bGU6ZSgiRWRpdCBoaXN0b3J5IEFubm90YXRpb24iKSxjbGFzc2VzOiJoaXN0
b3I9CnktYW5ub3RhdGUtYnRuIixmYUljb246ImZhLWNvbW1lbnQifSkuYXBwZW5kVG8oaC5maW5k
KCIuaGlzdG9yeS1zZWNvbmRhcnktYT0KY3Rpb25zIikpfSl9LF9yZW5kZXJTZWxlY3RCdXR0b246
ZnVuY3Rpb24oaCl7cmV0dXJuIGZhSWNvbkJ1dHRvbih7dGl0bGU6ZSgiPQpPcGVyYXRpb25zIG9u
IG11bHRpcGxlIGRhdGFzZXRzIiksY2xhc3NlczoiaGlzdG9yeS1zZWxlY3QtYnRuIixmYUljb246
ImZhLWM9CmhlY2stc3F1YXJlLW8ifSl9LF9zZXRVcEJlaGF2aW91cnM6ZnVuY3Rpb24oaCl7aD0z
RGh8fHRoaXMuJGVsO2QuUmVhZE9ubHlIaT0Kc3RvcnlQYW5lbC5wcm90b3R5cGUuX3NldFVwQmVo
YXZpb3Vycy5jYWxsKHRoaXMsaCk7aWYoIXRoaXMubW9kZWwpe3JldHVybn10PQpoaXMuX3NldFVw
RGF0YXNldEFjdGlvbnNQb3B1cChoKTtpZigoIUdhbGF4eS5jdXJyVXNlcnx8R2FsYXh5LmN1cnJV
c2VyLmlzQW49Cm9ueW1vdXMoKSl8fChHYWxheHkuY3VyclVzZXIuaWQhPTNEPTNEdGhpcy5tb2Rl
bC5nZXQoInVzZXJfaWQiKSkpe3JldHVybn12YT0KciBpPTNEdGhpcztoLmZpbmQoIi5oaXN0b3J5
LW5hbWUiKS5hdHRyKCJ0aXRsZSIsZSgiQ2xpY2sgdG8gcmVuYW1lIGhpc3RvcnkiPQopKS50b29s
dGlwKHtwbGFjZW1lbnQ6ImJvdHRvbSJ9KS5tYWtlX3RleHRfZWRpdGFibGUoe29uX2ZpbmlzaDpm
dW5jdGlvbihqKXs9CnZhciBrPTNEaS5tb2RlbC5nZXQoIm5hbWUiKTtpZihqJiZqIT0zRD0zRGsp
e2kuJGVsLmZpbmQoIi5oaXN0b3J5LW5hbWUiKS50ZT0KeHQoaik7aS5tb2RlbC5zYXZlKHtuYW1l
Omp9KS5mYWlsKGZ1bmN0aW9uKCl7aS4kZWwuZmluZCgiLmhpc3RvcnktbmFtZSIpLnRlPQp4dChp
Lm1vZGVsLnByZXZpb3VzKCJuYW1lIikpfSl9ZWxzZXtpLiRlbC5maW5kKCIuaGlzdG9yeS1uYW1l
IikudGV4dChrKX19fSk9Cn0sX3NldFVwRGF0YXNldEFjdGlvbnNQb3B1cDpmdW5jdGlvbihoKXt2
YXIgaT0zRHRoaXM7KG5ldyBQb3B1cE1lbnUoaC5maW5kKD0KIi5oaXN0b3J5LWRhdGFzZXQtYWN0
aW9uLXBvcHVwLWJ0biIpLFt7aHRtbDplKCJIaWRlIGRhdGFzZXRzIiksZnVuYzpmdW5jdGlvPQpu
KCl7dmFyIGo9M0RmLkhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb24ucHJvdG90eXBlLmhpZGU7aS5n
ZXRTZWxlY3RlZEhkYUNvbGw9CmVjdGlvbigpLmFqYXhRdWV1ZShqKX19LHtodG1sOmUoIlVuaGlk
ZSBkYXRhc2V0cyIpLGZ1bmM6ZnVuY3Rpb24oKXt2YXIgaj0zRD0KZi5IaXN0b3J5RGF0YXNldEFz
c29jaWF0aW9uLnByb3RvdHlwZS51bmhpZGU7aS5nZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKS5h
PQpqYXhRdWV1ZShqKX19LHtodG1sOmUoIkRlbGV0ZSBkYXRhc2V0cyIpLGZ1bmM6ZnVuY3Rpb24o
KXt2YXIgaj0zRGYuSGlzdG9yeUQ9CmF0YXNldEFzc29jaWF0aW9uLnByb3RvdHlwZVsiZGVsZXRl
Il07aS5nZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKS5hamF4UXVldT0KZShqKX19LHtodG1sOmUo
IlVuZGVsZXRlIGRhdGFzZXRzIiksZnVuYzpmdW5jdGlvbigpe3ZhciBqPTNEZi5IaXN0b3J5RGF0
YXNlPQp0QXNzb2NpYXRpb24ucHJvdG90eXBlLnVuZGVsZXRlO2kuZ2V0U2VsZWN0ZWRIZGFDb2xs
ZWN0aW9uKCkuYWpheFF1ZXVlKGopfX09Cix7aHRtbDplKCJQZXJtYW5lbnRseSBkZWxldGUgZGF0
YXNldHMiKSxmdW5jOmZ1bmN0aW9uKCl7aWYoY29uZmlybShlKCJUaGlzID0Kd2lsbCBwZXJtYW5l
bnRseSByZW1vdmUgdGhlIGRhdGEgaW4geW91ciBkYXRhc2V0cy4gQXJlIHlvdSBzdXJlPyIpKSl7
dmFyIGo9Cj0zRGYuSGlzdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5wcm90b3R5cGUucHVyZ2U7aS5n
ZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKT0KLmFqYXhRdWV1ZShqKX19fV0pKX0sX2hhbmRsZUhk
YURlbGV0aW9uQ2hhbmdlOmZ1bmN0aW9uKGgpe2lmKGguZ2V0KCJkZWxldGVkPQoiKSYmIXRoaXMu
c3RvcmFnZS5nZXQoInNob3dfZGVsZXRlZCIpKXt0aGlzLnJlbW92ZUhkYVZpZXcodGhpcy5oZGFW
aWV3c1toLmk9CmRdKX19LF9oYW5kbGVIZGFWaXNpYmxlQ2hhbmdlOmZ1bmN0aW9uKGgpe2lmKGgu
aGlkZGVuKCkmJiF0aGlzLnN0b3JhZ2UuZ2V0KD0KInNob3dfaGlkZGVuIikpe3RoaXMucmVtb3Zl
SGRhVmlldyh0aGlzLmhkYVZpZXdzW2guaWRdKX19LF9jcmVhdGVIZGFWaWV3OmZ1PQpuY3Rpb24o
aSl7dmFyIGg9M0RpLmdldCgiaWQiKSxqPTNEbmV3IHRoaXMuSERBVmlld0NsYXNzKHttb2RlbDpp
LGxpbmtUYXJnZXQ9Cjp0aGlzLmxpbmtUYXJnZXQsZXhwYW5kZWQ6dGhpcy5zdG9yYWdlLmdldCgi
ZXhwYW5kZWRIZGFzIilbaF0sc2VsZWN0YWJsZTp0aD0KaXMuc2VsZWN0aW5nLGhhc1VzZXI6dGhp
cy5tb2RlbC5vd25lZEJ5Q3VyclVzZXIoKSxsb2dnZXI6dGhpcy5sb2dnZXIsdGFnc0VkPQppdG9y
U2hvd246KHRoaXMudGFnc0VkaXRvciYmIXRoaXMudGFnc0VkaXRvci5oaWRkZW4pLGFubm90YXRp
b25FZGl0b3JTaG93bjo9Cih0aGlzLmFubm90YXRpb25FZGl0b3ImJiF0aGlzLmFubm90YXRpb25F
ZGl0b3IuaGlkZGVuKX0pO3RoaXMuX3NldFVwSGRhTGlzdD0KZW5lcnMoaik7cmV0dXJuIGp9LF9z
ZXRVcEhkYUxpc3RlbmVyczpmdW5jdGlvbihpKXt2YXIgaD0zRHRoaXM7ZC5SZWFkT25seUhpPQpz
dG9yeVBhbmVsLnByb3RvdHlwZS5fc2V0VXBIZGFMaXN0ZW5lcnMuY2FsbCh0aGlzLGkpO2kub24o
InNlbGVjdGVkIixmdW5jdGk9Cm9uKGope3ZhciBrPTNEai5tb2RlbC5nZXQoImlkIik7aC5zZWxl
Y3RlZEhkYUlkcz0zRF8udW5pb24oaC5zZWxlY3RlZEhkYUlkcz0KLFtrXSl9KTtpLm9uKCJkZS1z
ZWxlY3RlZCIsZnVuY3Rpb24oail7dmFyIGs9M0RqLm1vZGVsLmdldCgiaWQiKTtoLnNlbGVjdGVk
PQpIZGFJZHM9M0RfLndpdGhvdXQoaC5zZWxlY3RlZEhkYUlkcyxrKX0pfSx0b2dnbGVIREFUYWdF
ZGl0b3JzOmZ1bmN0aW9uKGgpe3Y9CmFyIGk9M0Rhcmd1bWVudHM7Xy5lYWNoKHRoaXMuaGRhVmll
d3MsZnVuY3Rpb24oail7aWYoai50YWdzRWRpdG9yKXtqLnRhZ3NFZD0KaXRvci50b2dnbGUuYXBw
bHkoai50YWdzRWRpdG9yLGkpfX0pfSx0b2dnbGVIREFBbm5vdGF0aW9uRWRpdG9yczpmdW5jdGlv
bihoPQope3ZhciBpPTNEYXJndW1lbnRzO18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGop
e2lmKGouYW5ub3RhdGlvbkVkaXRvcik9CntqLmFubm90YXRpb25FZGl0b3IudG9nZ2xlLmFwcGx5
KGouYW5ub3RhdGlvbkVkaXRvcixpKX19KX0scmVtb3ZlSGRhVmlldzpmdT0KbmN0aW9uKGkpe2lm
KCFpKXtyZXR1cm59dmFyIGg9M0R0aGlzO2kuJGVsLmZhZGVPdXQoaC5meFNwZWVkLGZ1bmN0aW9u
KCl7aS5vPQpmZigpO2kucmVtb3ZlKCk7ZGVsZXRlIGguaGRhVmlld3NbaS5tb2RlbC5pZF07aWYo
Xy5pc0VtcHR5KGguaGRhVmlld3MpKXtoLiQ9CmVtcHR5TWVzc2FnZSgpLmZhZGVJbihoLmZ4U3Bl
ZWQsZnVuY3Rpb24oKXtoLnRyaWdnZXIoImVtcHR5LWhpc3RvcnkiLGgpfSl9fT0KKX0sZXZlbnRz
Ol8uZXh0ZW5kKF8uY2xvbmUoZC5SZWFkT25seUhpc3RvcnlQYW5lbC5wcm90b3R5cGUuZXZlbnRz
KSx7ImNsaWNrPQogLmhpc3Rvcnktc2VsZWN0LWJ0biI6InRvZ2dsZVNlbGVjdG9ycyIsImNsaWNr
IC5oaXN0b3J5LXNlbGVjdC1hbGwtZGF0YXNldHM9Ci1idG4iOiJzZWxlY3RBbGxEYXRhc2V0cyIs
ImNsaWNrIC5oaXN0b3J5LWRlc2VsZWN0LWFsbC1kYXRhc2V0cy1idG4iOiJkZXNlbD0KZWN0QWxs
RGF0YXNldHMifSksdXBkYXRlSGlzdG9yeURpc2tTaXplOmZ1bmN0aW9uKCl7dGhpcy4kZWwuZmlu
ZCgiLmhpc3RvcnktPQpzaXplIikudGV4dCh0aGlzLm1vZGVsLmdldCgibmljZV9zaXplIikpfSxz
aG93U2VsZWN0b3JzOmZ1bmN0aW9uKGgpe2g9M0QoaCE9Cj0zRD0zRHVuZGVmaW5lZCk/KGgpOih0
aGlzLmZ4U3BlZWQpO3RoaXMuc2VsZWN0aW5nPTNEdHJ1ZTt0aGlzLiQoIi5oaXN0b3J5LT0KZGF0
YXNldC1hY3Rpb25zIikuc2xpZGVEb3duKGgpO18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9u
KGkpe2kuc2hvd1NlbGVjPQp0b3IoKX0pO3RoaXMuc2VsZWN0ZWRIZGFJZHM9M0RbXX0saGlkZVNl
bGVjdG9yczpmdW5jdGlvbihoKXtoPTNEKGghPTNEPTNEdW49CmRlZmluZWQpPyhoKToodGhpcy5m
eFNwZWVkKTt0aGlzLnNlbGVjdGluZz0zRGZhbHNlO3RoaXMuJCgiLmhpc3RvcnktZGF0YXNldD0K
LWFjdGlvbnMiKS5zbGlkZVVwKGgpO18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGkpe2ku
aGlkZVNlbGVjdG9yKCl9KTt0PQpoaXMuc2VsZWN0ZWRIZGFJZHM9M0RbXX0sdG9nZ2xlU2VsZWN0
b3JzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2VsZWN0aW5nKXt0aGk9CnMuc2hvd1NlbGVjdG9ycygp
fWVsc2V7dGhpcy5oaWRlU2VsZWN0b3JzKCl9fSxzZWxlY3RBbGxEYXRhc2V0czpmdW5jdGlvbiho
KT0Ke18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGkpe2kuc2VsZWN0KGgpfSl9LGRlc2Vs
ZWN0QWxsRGF0YXNldHM6ZnVuY3RpPQpvbihoKXtfLmVhY2godGhpcy5oZGFWaWV3cyxmdW5jdGlv
bihpKXtpLmRlc2VsZWN0KGgpfSl9LGdldFNlbGVjdGVkSGRhVmlld3M9CjpmdW5jdGlvbigpe3Jl
dHVybiBfLmZpbHRlcih0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGgpe3JldHVybiBoLnNlbGVjdGVk
fSl9LD0KZ2V0U2VsZWN0ZWRIZGFDb2xsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBmLkhE
QUNvbGxlY3Rpb24oXy5tYXAodGhpcy5nPQpldFNlbGVjdGVkSGRhVmlld3MoKSxmdW5jdGlvbiho
KXtyZXR1cm4gaC5tb2RlbH0pLHtoaXN0b3J5SWQ6dGhpcy5tb2RlbC5pZH09Cil9LHRvU3RyaW5n
OmZ1bmN0aW9uKCl7cmV0dXJuIkhpc3RvcnlQYW5lbCgiKygodGhpcy5tb2RlbCk/KHRoaXMubW9k
ZWwuZ2V0KD0KIm5hbWUiKSk6KCIiKSkrIikifX0pO3JldHVybntIaXN0b3J5UGFuZWw6Z319KTsK
XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAx
NjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNh
ZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvaGlzdG9yeS9yZWFkb25seS1oaXN0
b3J5LXBhbmVsLj0KanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L3Jl
YWRvbmx5LWhpc3RvcnktcGFuZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9o
aXN0b3J5L3JlYWRvbmx5LWhpc3RvcnktcGFuZWwuanMKQEAgLTEsMSArMSwxIEBACi1kZWZpbmUo
WyJtdmMvaGlzdG9yeS9oaXN0b3J5LW1vZGVsIiwibXZjL2RhdGFzZXQvaGRhLWJhc2UiLCJtdmMv
dXNlci91c2VyLT0KbW9kZWwiLCJtdmMvYmFzZS1tdmMiXSxmdW5jdGlvbihmLGIsYSxlKXt2YXIg
aD0zRGUuU2Vzc2lvblN0b3JhZ2VNb2RlbC5leHRlPQpuZCh7ZGVmYXVsdHM6e2V4cGFuZGVkSGRh
czp7fSxzaG93X2RlbGV0ZWQ6ZmFsc2Usc2hvd19oaWRkZW46ZmFsc2V9LGFkZEV4cGE9Cm5kZWRI
ZGE6ZnVuY3Rpb24obCl7dmFyIGs9M0QiZXhwYW5kZWRIZGFzIjt0aGlzLnNhdmUoayxfLmV4dGVu
ZCh0aGlzLmdldChrKT0KLF8ub2JqZWN0KFtsXSxbdHJ1ZV0pKSl9LHJlbW92ZUV4cGFuZGVkSGRh
OmZ1bmN0aW9uKGwpe3ZhciBrPTNEImV4cGFuZGVkSGRhPQpzIjt0aGlzLnNhdmUoayxfLm9taXQo
dGhpcy5nZXQoayksbCkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJIaXN0b3J5UHI9CmVm
cygiK3RoaXMuaWQrIikifX0pO2guc3RvcmFnZUtleVByZWZpeD0zRCJoaXN0b3J5OiI7aC5oaXN0
b3J5U3RvcmFnZUtleT0zRD0KZnVuY3Rpb24gZChrKXtpZighayl7dGhyb3cgbmV3IEVycm9yKCJI
aXN0b3J5UHJlZnMuaGlzdG9yeVN0b3JhZ2VLZXkgbmVlZHMgPQp2YWxpZCBpZDogIitrKX1yZXR1
cm4oaC5zdG9yYWdlS2V5UHJlZml4K2spfTtoLmdldD0zRGZ1bmN0aW9uIGMoayl7cmV0dXJuIG49
CmV3IGgoe2lkOmguaGlzdG9yeVN0b3JhZ2VLZXkoayl9KX07aC5jbGVhckFsbD0zRGZ1bmN0aW9u
IGcobCl7Zm9yKHZhciBrIGluID0Kc2Vzc2lvblN0b3JhZ2Upe2lmKGsuaW5kZXhPZihoLnN0b3Jh
Z2VLZXlQcmVmaXgpPTNEPTNEPTNEMCl7c2Vzc2lvblN0b3JhZ2UuPQpyZW1vdmVJdGVtKGspfX19
O3ZhciBpPTNEQmFja2JvbmUuVmlldy5leHRlbmQoZS5Mb2dnYWJsZU1peGluKS5leHRlbmQoe0hE
QVY9Cmlld0NsYXNzOmIuSERBQmFzZVZpZXcsdGFnTmFtZToiZGl2IixjbGFzc05hbWU6Imhpc3Rv
cnktcGFuZWwiLGZ4U3BlZWQ6ImZhcz0KdCIsZW1wdHlNc2c6X2woIlRoaXMgaGlzdG9yeSBpcyBl
bXB0eSIpLG5vbmVGb3VuZE1zZzpfbCgiTm8gbWF0Y2hpbmcgZGF0YXNlPQp0cyBmb3VuZCIpLGlu
aXRpYWxpemU6ZnVuY3Rpb24oayl7az0zRGt8fHt9O2lmKGsubG9nZ2VyKXt0aGlzLmxvZ2dlcj0z
RGsubG89CmdnZXJ9dGhpcy5sb2codGhpcysiLmluaXRpYWxpemU6IixrKTt0aGlzLmxpbmtUYXJn
ZXQ9M0RrLmxpbmtUYXJnZXR8fCJfYmxhbj0KayI7dGhpcy5meFNwZWVkPTNEXy5oYXMoaywiZnhT
cGVlZCIpPyhrLmZ4U3BlZWQpOih0aGlzLmZ4U3BlZWQpO3RoaXMuZmlsdGVyPQpzPTNEW107dGhp
cy5zZWFyY2hGb3I9M0QiIjt0aGlzLmZpbmRDb250YWluZXJGbj0zRGsuZmluZENvbnRhaW5lckZu
O3RoaXMuaGQ9CmFWaWV3cz0zRHt9O3RoaXMuaW5kaWNhdG9yPTNEbmV3IExvYWRpbmdJbmRpY2F0
b3IodGhpcy4kZWwpO3RoaXMuX3NldFVwTGlzdD0KZW5lcnMoKTt2YXIgbD0zRF8ucGljayhrLCJp
bml0aWFsbHlFeHBhbmRlZCIsInNob3dfZGVsZXRlZCIsInNob3dfaGlkZGVuIik7PQp0aGlzLnNl
dE1vZGVsKHRoaXMubW9kZWwsbCxmYWxzZSk7aWYoay5vbnJlYWR5KXtrLm9ucmVhZHkuY2FsbCh0
aGlzKX19LF9zZXQ9ClVwTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5vbigiZXJyb3IiLGZ1bmN0
aW9uKGwsbyxrLG4sbSl7dGhpcy5lcnJvckhhbmRsZT0KcihsLG8sayxuLG0pfSk7dGhpcy5vbigi
bG9hZGluZy1oaXN0b3J5IixmdW5jdGlvbigpe3RoaXMuX3Nob3dMb2FkaW5nSW5kaWNhPQp0b3Io
ImxvYWRpbmcgaGlzdG9yeS4uLiIsNDApfSk7dGhpcy5vbigibG9hZGluZy1kb25lIixmdW5jdGlv
bigpe3RoaXMuX2hpZGU9CkxvYWRpbmdJbmRpY2F0b3IoNDApO2lmKF8uaXNFbXB0eSh0aGlzLmhk
YVZpZXdzKSl7dGhpcy50cmlnZ2VyKCJlbXB0eS1oaXN0bz0KcnkiLHRoaXMpfX0pO3RoaXMub25j
ZSgicmVuZGVyZWQiLGZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyKCJyZW5kZXJlZDppbml0aWFsPQoi
LHRoaXMpO3JldHVybiBmYWxzZX0pO2lmKHRoaXMubG9nZ2VyKXt0aGlzLm9uKCJhbGwiLGZ1bmN0
aW9uKGspe3RoaXMubG9nKHQ9CmhpcysiIixhcmd1bWVudHMpfSx0aGlzKX1yZXR1cm4gdGhpc30s
ZXJyb3JIYW5kbGVyOmZ1bmN0aW9uKG0scCxsLG8sbil7Y29ucz0Kb2xlLmVycm9yKG0scCxsLG8s
bik7aWYocCYmcC5zdGF0dXM9M0Q9M0Q9M0QwJiZwLnJlYWR5U3RhdGU9M0Q9M0Q9M0QwKXt9ZWxz
PQple2lmKHAmJnAuc3RhdHVzPTNEPTNEPTNENTAyKXt9ZWxzZXt2YXIgaz0zRHRoaXMuX3BhcnNl
RXJyb3JNZXNzYWdlKG0scCxsLG89CixuKTtpZighdGhpcy4kbWVzc2FnZXMoKS5pcygiOnZpc2li
bGUiKSl7dGhpcy5vbmNlKCJyZW5kZXJlZCIsZnVuY3Rpb24oKXt0aD0KaXMuZGlzcGxheU1lc3Nh
Z2UoImVycm9yIixrLm1lc3NhZ2Usay5kZXRhaWxzKX0pfWVsc2V7dGhpcy5kaXNwbGF5TWVzc2Fn
ZSgiPQplcnJvciIsay5tZXNzYWdlLGsuZGV0YWlscyl9fX19LF9wYXJzZUVycm9yTWVzc2FnZTpm
dW5jdGlvbihuLHIsbSxxLHApe3ZhciA9Cmw9M0RHYWxheHkuY3VyclVzZXIsaz0zRHttZXNzYWdl
OnRoaXMuX2JlUG9saXRlKHEpLGRldGFpbHM6e3VzZXI6KGwgaW5zdGFuYz0KZW9mIGEuVXNlcik/
KGwudG9KU09OKCkpOihsKyIiKSxzb3VyY2U6KG4gaW5zdGFuY2VvZiBCYWNrYm9uZS5Nb2RlbCk/
KG4udG9KPQpTT04oKSk6KG4rIiIpLHhocjpyLG9wdGlvbnM6KHIpPyhfLm9taXQobSwieGhyIikp
OihtKX19O18uZXh0ZW5kKGsuZGV0YWlscyw9CnB8fHt9KTtpZihyJiZfLmlzRnVuY3Rpb24oci5n
ZXRBbGxSZXNwb25zZUhlYWRlcnMpKXt2YXIgbz0zRHIuZ2V0QWxsUmVzcG9ucz0KZUhlYWRlcnMo
KTtvPTNEXy5jb21wYWN0KG8uc3BsaXQoIlxuIikpO289M0RfLm1hcChvLGZ1bmN0aW9uKHMpe3Jl
dHVybiBzLnNwPQpsaXQoIjogIil9KTtrLmRldGFpbHMueGhyLnJlc3BvbnNlSGVhZGVycz0zRF8u
b2JqZWN0KG8pfXJldHVybiBrfSxfYmVQb2xpdGU9CjpmdW5jdGlvbihrKXtrPTNEa3x8X2woIkFu
IGVycm9yIG9jY3VycmVkIHdoaWxlIGdldHRpbmcgdXBkYXRlcyBmcm9tIHRoZSBzZT0KcnZlciIp
O3JldHVybiBrKyIuICIrX2woIlBsZWFzZSBjb250YWN0IGEgR2FsYXh5IGFkbWluaXN0cmF0b3Ig
aWYgdGhlIHByb2JsPQplbSBwZXJzaXN0cy4iKX0sbG9hZEhpc3RvcnlXaXRoSERBRGV0YWlsczpm
dW5jdGlvbihtLGwsayxvKXt2YXIgbj0zRGZ1bmN0aW89Cm4ocCl7cmV0dXJuIF8ua2V5cyhoLmdl
dChwLmlkKS5nZXQoImV4cGFuZGVkSGRhcyIpKX07cmV0dXJuIHRoaXMubG9hZEhpc3Rvcj0KeSht
LGwsayxvLG4pfSxsb2FkSGlzdG9yeTpmdW5jdGlvbihuLG0sbCxxLG8pe3ZhciBrPTNEdGhpcztt
PTNEbXx8e307ay50cmlnPQpnZXIoImxvYWRpbmctaGlzdG9yeSIsayk7dmFyIHA9M0RmLkhpc3Rv
cnkuZ2V0SGlzdG9yeURhdGEobix7aGlzdG9yeUZuOmwsaGQ9CmFGbjpxLGhkYURldGFpbElkczpt
LmluaXRpYWxseUV4cGFuZGVkfHxvfSk7cmV0dXJuIGsuX2xvYWRIaXN0b3J5RnJvbVhIUihwLD0K
bSkuZmFpbChmdW5jdGlvbih0LHIscyl7ay50cmlnZ2VyKCJlcnJvciIsayx0LG0sX2woIkFuIGVy
cm9yIHdhcyBlbmNvdW50ZXJlPQpkIHdoaWxlICIrcikse2hpc3RvcnlJZDpuLGhpc3Rvcnk6c3x8
e319KX0pLmFsd2F5cyhmdW5jdGlvbigpe2sudHJpZ2dlcigibG89CmFkaW5nLWRvbmUiLGspfSl9
LF9sb2FkSGlzdG9yeUZyb21YSFI6ZnVuY3Rpb24obSxsKXt2YXIgaz0zRHRoaXM7bS50aGVuKGZ1
bj0KY3Rpb24obixvKXtrLkpTT05Ub01vZGVsKG4sbyxsKX0pO20uZmFpbChmdW5jdGlvbihvLG4p
e2sucmVuZGVyKCl9KTtyZXR1cm4gPQptfSxKU09OVG9Nb2RlbDpmdW5jdGlvbihuLGssbCl7dGhp
cy5sb2coIkpTT05Ub01vZGVsOiIsbixrLGwpO2w9M0RsfHx7fTt2YXI9CiBtPTNEbmV3IGYuSGlz
dG9yeShuLGssbCk7dGhpcy5zZXRNb2RlbChtKTtyZXR1cm4gdGhpc30sc2V0TW9kZWw6ZnVuY3Rp
b24obD0KLGssbSl7az0zRGt8fHt9O209M0QobSE9M0Q9M0R1bmRlZmluZWQpPyhtKToodHJ1ZSk7
dGhpcy5sb2coInNldE1vZGVsOiIsbCxrPQosbSk7dGhpcy5mcmVlTW9kZWwoKTt0aGlzLnNlbGVj
dGVkSGRhSWRzPTNEW107aWYobCl7dGhpcy5tb2RlbD0zRGw7aWYodGhpcy49CmxvZ2dlcil7dGhp
cy5tb2RlbC5sb2dnZXI9M0R0aGlzLmxvZ2dlcn10aGlzLl9zZXRVcFdlYlN0b3JhZ2Uoay5pbml0
aWFsbHlFeD0KcGFuZGVkLGsuc2hvd19kZWxldGVkLGsuc2hvd19oaWRkZW4pO3RoaXMuX3NldFVw
TW9kZWxFdmVudEhhbmRsZXJzKCk7dGhpcy50PQpyaWdnZXIoIm5ldy1tb2RlbCIsdGhpcyl9aWYo
bSl7dGhpcy5yZW5kZXIoKX1yZXR1cm4gdGhpc30sZnJlZU1vZGVsOmZ1bmN0aW89Cm4oKXtpZih0
aGlzLm1vZGVsKXt0aGlzLm1vZGVsLmNsZWFyVXBkYXRlVGltZW91dCgpO3RoaXMuc3RvcExpc3Rl
bmluZyh0aGlzLj0KbW9kZWwpO3RoaXMuc3RvcExpc3RlbmluZyh0aGlzLm1vZGVsLmhkYXMpfXRo
aXMuZnJlZUhkYVZpZXdzKCk7cmV0dXJuIHRoaXN9PQosZnJlZUhkYVZpZXdzOmZ1bmN0aW9uKCl7
dGhpcy5oZGFWaWV3cz0zRHt9O3JldHVybiB0aGlzfSxfc2V0VXBXZWJTdG9yYWdlOmY9CnVuY3Rp
b24obCxrLG0pe3RoaXMuc3RvcmFnZT0zRG5ldyBoKHtpZDpoLmhpc3RvcnlTdG9yYWdlS2V5KHRo
aXMubW9kZWwuZ2V0KD0KImlkIikpfSk7aWYoXy5pc09iamVjdChsKSl7dGhpcy5zdG9yYWdlLnNl
dCgiZXhhbmRlZEhkYXMiLGwpfWlmKF8uaXNCb29sZWFuPQooaykpe3RoaXMuc3RvcmFnZS5zZXQo
InNob3dfZGVsZXRlZCIsayl9aWYoXy5pc0Jvb2xlYW4obSkpe3RoaXMuc3RvcmFnZS5zZXQ9Cigi
c2hvd19oaWRkZW4iLG0pfXRoaXMudHJpZ2dlcigibmV3LXN0b3JhZ2UiLHRoaXMuc3RvcmFnZSx0
aGlzKTt0aGlzLmxvZyh0aD0KaXMrIiAoaW5pdCdkKSBzdG9yYWdlOiIsdGhpcy5zdG9yYWdlLmdl
dCgpKTtyZXR1cm4gdGhpc30sX3NldFVwTW9kZWxFdmVudEhhPQpuZGxlcnM6ZnVuY3Rpb24oKXt0
aGlzLm1vZGVsLmhkYXMub24oImFkZCIsdGhpcy5hZGRIZGFWaWV3LHRoaXMpO3RoaXMubW9kZWw9
Ci5vbigiZXJyb3IgZXJyb3I6aGRhcyIsZnVuY3Rpb24obCxuLGssbSl7dGhpcy5lcnJvckhhbmRs
ZXIobCxuLGssbSl9LHRoaXMpOz0KcmV0dXJuIHRoaXN9LHJlbmRlcjpmdW5jdGlvbihtLG4pe3Ro
aXMubG9nKCJyZW5kZXI6IixtLG4pO209M0QobT0zRD0zRD0zRHVuPQpkZWZpbmVkKT8odGhpcy5m
eFNwZWVkKToobSk7dmFyIGs9M0R0aGlzLGw7aWYodGhpcy5tb2RlbCl7bD0zRHRoaXMucmVuZGVy
TW89CmRlbCgpfWVsc2V7bD0zRHRoaXMucmVuZGVyV2l0aG91dE1vZGVsKCl9JChrKS5xdWV1ZSgi
ZngiLFtmdW5jdGlvbihvKXtpZihtJj0KJmsuJGVsLmlzKCI6dmlzaWJsZSIpKXtrLiRlbC5mYWRl
T3V0KG0sbyl9ZWxzZXtvKCl9fSxmdW5jdGlvbihvKXtrLiRlbC5lbXB0PQp5KCk7aWYobCl7ay4k
ZWwuYXBwZW5kKGwuY2hpbGRyZW4oKSl9bygpfSxmdW5jdGlvbihvKXtpZihtJiYhay4kZWwuaXMo
Ijp2aXM9CmlibGUiKSl7ay4kZWwuZmFkZUluKG0sbyl9ZWxzZXtvKCl9fSxmdW5jdGlvbihvKXtp
ZihuKXtuLmNhbGwodGhpcyl9ay50cmlnZz0KZXIoInJlbmRlcmVkIix0aGlzKTtvKCl9XSk7cmV0
dXJuIHRoaXN9LHJlbmRlcldpdGhvdXRNb2RlbDpmdW5jdGlvbigpe3ZhciBrPQo9M0QkKCI8ZGl2
Lz4iKSxsPTNEJCgiPGRpdi8+IikuYWRkQ2xhc3MoIm1lc3NhZ2UtY29udGFpbmVyIikuY3NzKHtt
YXJnaW46IjQ9CnB4In0pO3JldHVybiBrLmFwcGVuZChsKX0scmVuZGVyTW9kZWw6ZnVuY3Rpb24o
KXt2YXIgaz0zRCQoIjxkaXYvPiIpO2suYXBwZT0KbmQoaS50ZW1wbGF0ZXMuaGlzdG9yeVBhbmVs
KHRoaXMubW9kZWwudG9KU09OKCkpKTt0aGlzLiRlbXB0eU1lc3NhZ2UoaykudGV4PQp0KHRoaXMu
ZW1wdHlNc2cpO2suZmluZCgiLmhpc3Rvcnktc2Vjb25kYXJ5LWFjdGlvbnMiKS5wcmVwZW5kKHRo
aXMuX3JlbmRlclM9CmVhcmNoQnV0dG9uKCkpO3RoaXMuX3NldFVwQmVoYXZpb3VycyhrKTt0aGlz
LnJlbmRlckhkYXMoayk7cmV0dXJuIGt9LF9yZW5kZT0KckVtcHR5TXNnOmZ1bmN0aW9uKG0pe3Zh
ciBsPTNEdGhpcyxrPTNEbC4kZW1wdHlNZXNzYWdlKG0pO2lmKCFfLmlzRW1wdHkobC5oPQpkYVZp
ZXdzKSl7ay5oaWRlKCl9ZWxzZXtpZihsLnNlYXJjaEZvcil7ay50ZXh0KGwubm9uZUZvdW5kTXNn
KS5zaG93KCl9ZWxzZXs9CmsudGV4dChsLmVtcHR5TXNnKS5zaG93KCl9fXJldHVybiB0aGlzfSxf
cmVuZGVyU2VhcmNoQnV0dG9uOmZ1bmN0aW9uKGspe3JldD0KdXJuIGZhSWNvbkJ1dHRvbih7dGl0
bGU6X2woIlNlYXJjaCBkYXRhc2V0cyIpLGNsYXNzZXM6Imhpc3Rvcnktc2VhcmNoLWJ0biIsPQpm
YUljb246ImZhLXNlYXJjaCJ9KX0sX3NldFVwQmVoYXZpb3VyczpmdW5jdGlvbihrKXtrPTNEa3x8
dGhpcy4kZWw7ay5maW5kKCI9Clt0aXRsZV0iKS50b29sdGlwKHtwbGFjZW1lbnQ6ImJvdHRvbSJ9
KTt0aGlzLl9zZXRVcFNlYXJjaElucHV0KGsuZmluZCgiLmhpcz0KdG9yeS1zZWFyY2gtY29udHJv
bHMgLmhpc3Rvcnktc2VhcmNoLWlucHV0IikpO3JldHVybiB0aGlzfSwkY29udGFpbmVyOmZ1bmN0
PQppb24oKXtyZXR1cm4odGhpcy5maW5kQ29udGFpbmVyRm4pPyh0aGlzLmZpbmRDb250YWluZXJG
bi5jYWxsKHRoaXMpKToodGhpcy49CiRlbC5wYXJlbnQoKSl9LCRkYXRhc2V0c0xpc3Q6ZnVuY3Rp
b24oayl7cmV0dXJuKGt8fHRoaXMuJGVsKS5maW5kKCIuZGF0YXNldD0Kcy1saXN0Iil9LCRtZXNz
YWdlczpmdW5jdGlvbihrKXtyZXR1cm4oa3x8dGhpcy4kZWwpLmZpbmQoIi5tZXNzYWdlLWNvbnRh
aW5lPQpyIil9LCRlbXB0eU1lc3NhZ2U6ZnVuY3Rpb24oayl7cmV0dXJuKGt8fHRoaXMuJGVsKS5m
aW5kKCIuZW1wdHktaGlzdG9yeS1tZXM9CnNhZ2UiKX0scmVuZGVySGRhczpmdW5jdGlvbihsKXts
PTNEbHx8dGhpcy4kZWw7dmFyIGs9M0R0aGlzLG49M0R7fSxtPTNEdGhpcz0KLm1vZGVsLmhkYXMu
Z2V0VmlzaWJsZSh0aGlzLnN0b3JhZ2UuZ2V0KCJzaG93X2RlbGV0ZWQiKSx0aGlzLnN0b3JhZ2Uu
Z2V0KCJzPQpob3dfaGlkZGVuIiksdGhpcy5maWx0ZXJzKTt0aGlzLiRkYXRhc2V0c0xpc3QobCku
ZW1wdHkoKTtpZihtLmxlbmd0aCl7bS5lYWM9CmgoZnVuY3Rpb24ocCl7dmFyIG89M0RwLmdldCgi
aWQiKSxxPTNEay5fY3JlYXRlSGRhVmlldyhwKTtuW29dPTNEcTtpZihfLmNvbj0KdGFpbnMoay5z
ZWxlY3RlZEhkYUlkcyxvKSl7cS5zZWxlY3RlZD0zRHRydWV9ay5hdHRhY2hIZGFWaWV3KHEucmVu
ZGVyKCksbCl9PQopfXRoaXMuaGRhVmlld3M9M0RuO3RoaXMuX3JlbmRlckVtcHR5TXNnKGwpO3Jl
dHVybiB0aGlzLmhkYVZpZXdzfSxfY3JlYXRlSGQ9CmFWaWV3OmZ1bmN0aW9uKGwpe3ZhciBrPTNE
bC5nZXQoImlkIiksbT0zRG5ldyB0aGlzLkhEQVZpZXdDbGFzcyh7bW9kZWw6bCxsaT0KbmtUYXJn
ZXQ6dGhpcy5saW5rVGFyZ2V0LGV4cGFuZGVkOnRoaXMuc3RvcmFnZS5nZXQoImV4cGFuZGVkSGRh
cyIpW2tdLGhhc1VzPQplcjp0aGlzLm1vZGVsLm93bmVkQnlDdXJyVXNlcigpLGxvZ2dlcjp0aGlz
LmxvZ2dlcn0pO3RoaXMuX3NldFVwSGRhTGlzdGVuZXI9CnMobSk7cmV0dXJuIG19LF9zZXRVcEhk
YUxpc3RlbmVyczpmdW5jdGlvbihsKXt2YXIgaz0zRHRoaXM7bC5vbigiZXJyb3IiLGZ1bj0KY3Rp
b24obixwLG0sbyl7ay5lcnJvckhhbmRsZXIobixwLG0sbyl9KTtsLm9uKCJib2R5LWV4cGFuZGVk
IixmdW5jdGlvbihtKXtrPQouc3RvcmFnZS5hZGRFeHBhbmRlZEhkYShtKX0pO2wub24oImJvZHkt
Y29sbGFwc2VkIixmdW5jdGlvbihtKXtrLnN0b3JhZ2UucmU9Cm1vdmVFeHBhbmRlZEhkYShtKX0p
O3JldHVybiB0aGlzfSxhdHRhY2hIZGFWaWV3OmZ1bmN0aW9uKG0sbCl7bD0zRGx8fHRoaXMuJD0K
ZWw7dmFyIGs9M0R0aGlzLiRkYXRhc2V0c0xpc3QobCk7ay5wcmVwZW5kKG0uJGVsKTtyZXR1cm4g
dGhpc30sYWRkSGRhVmlldzpmPQp1bmN0aW9uKG4pe3RoaXMubG9nKCJhZGQuIit0aGlzLG4pO3Zh
ciBsPTNEdGhpcztpZighbi5pc1Zpc2libGUodGhpcy5zdG9yYWc9CmUuZ2V0KCJzaG93X2RlbGV0
ZWQiKSx0aGlzLnN0b3JhZ2UuZ2V0KCJzaG93X2hpZGRlbiIpKSl7cmV0dXJuIGx9JCh7fSkucXVl
dT0KZShbZnVuY3Rpb24gbShwKXt2YXIgbz0zRGwuJGVtcHR5TWVzc2FnZSgpO2lmKG8uaXMoIjp2
aXNpYmxlIikpe28uZmFkZU91dChsPQouZnhTcGVlZCxwKX1lbHNle3AoKX19LGZ1bmN0aW9uIGso
byl7dmFyIHA9M0RsLl9jcmVhdGVIZGFWaWV3KG4pO2wuaGRhVmlld3M9CltuLmlkXT0zRHA7cC5y
ZW5kZXIoKS4kZWwuaGlkZSgpO2wuc2Nyb2xsVG9Ub3AoKTtsLmF0dGFjaEhkYVZpZXcocCk7cC4k
ZWwucz0KbGlkZURvd24obC5meFNwZWVkKX1dKTtyZXR1cm4gbH0scmVmcmVzaEhkYXM6ZnVuY3Rp
b24obCxrKXtpZih0aGlzLm1vZGVsKXtyPQpldHVybiB0aGlzLm1vZGVsLnJlZnJlc2gobCxrKX1y
ZXR1cm4gJC53aGVuKCl9LGV2ZW50czp7ImNsaWNrIC5tZXNzYWdlLWNvbnQ9CmFpbmVyIjoiY2xl
YXJNZXNzYWdlcyIsImNsaWNrIC5oaXN0b3J5LXNlYXJjaC1idG4iOiJ0b2dnbGVTZWFyY2hDb250
cm9scyJ9LD0KY29sbGFwc2VBbGxIZGFCb2RpZXM6ZnVuY3Rpb24oKXtfLmVhY2godGhpcy5oZGFW
aWV3cyxmdW5jdGlvbihrKXtrLnRvZ2dsZUJvPQpkeVZpc2liaWxpdHkobnVsbCxmYWxzZSl9KTt0
aGlzLnN0b3JhZ2Uuc2V0KCJleHBhbmRlZEhkYXMiLHt9KTtyZXR1cm4gdGhpc309Cix0b2dnbGVT
aG93RGVsZXRlZDpmdW5jdGlvbihrKXtrPTNEKGshPTNEPTNEdW5kZWZpbmVkKT8oayk6KCF0aGlz
LnN0b3JhZ2UuZz0KZXQoInNob3dfZGVsZXRlZCIpKTt0aGlzLnN0b3JhZ2Uuc2V0KCJzaG93X2Rl
bGV0ZWQiLGspO3RoaXMucmVuZGVySGRhcygpO3JlPQp0dXJuIHRoaXMuc3RvcmFnZS5nZXQoInNo
b3dfZGVsZXRlZCIpfSx0b2dnbGVTaG93SGlkZGVuOmZ1bmN0aW9uKGspe2s9M0QoayE9Cj0zRD0z
RHVuZGVmaW5lZCk/KGspOighdGhpcy5zdG9yYWdlLmdldCgic2hvd19oaWRkZW4iKSk7dGhpcy5z
dG9yYWdlLnNldCgicz0KaG93X2hpZGRlbiIsayk7dGhpcy5yZW5kZXJIZGFzKCk7cmV0dXJuIHRo
aXMuc3RvcmFnZS5nZXQoInNob3dfaGlkZGVuIil9LF9zPQpldFVwU2VhcmNoSW5wdXQ6ZnVuY3Rp
b24obCl7dmFyIG09M0R0aGlzLG49M0QiLmhpc3Rvcnktc2VhcmNoLWlucHV0IjtmdW5jdGk9Cm9u
IGsobyl7aWYobS5tb2RlbC5oZGFzLmhhdmVEZXRhaWxzKCkpe20uc2VhcmNoSGRhcyhvKTtyZXR1
cm59bS4kZWwuZmluZChuKT0KLnNlYXJjaElucHV0KCJ0b2dnbGUtbG9hZGluZyIpO20ubW9kZWwu
aGRhcy5mZXRjaEFsbERldGFpbHMoe3NpbGVudDp0cnVlfSkuPQphbHdheXMoZnVuY3Rpb24oKXtt
LiRlbC5maW5kKG4pLnNlYXJjaElucHV0KCJ0b2dnbGUtbG9hZGluZyIpfSkuZG9uZShmdW5jdGk9
Cm9uKCl7bS5zZWFyY2hIZGFzKG8pfSl9bC5zZWFyY2hJbnB1dCh7aW5pdGlhbFZhbDptLnNlYXJj
aEZvcixuYW1lOiJoaXN0b3J5LT0Kc2VhcmNoIixwbGFjZWhvbGRlcjoic2VhcmNoIGRhdGFzZXRz
IixjbGFzc2VzOiJoaXN0b3J5LXNlYXJjaCIsb25maXJzdHNlYXJjPQpoOmssb25zZWFyY2g6Xy5i
aW5kKHRoaXMuc2VhcmNoSGRhcyx0aGlzKSxvbmNsZWFyOl8uYmluZCh0aGlzLmNsZWFySGRhU2Vh
cmM9CmgsdGhpcyl9KTtyZXR1cm4gbH0sdG9nZ2xlU2VhcmNoQ29udHJvbHM6ZnVuY3Rpb24obSxr
KXt2YXIgbD0zRHRoaXMuJGVsLmZpbj0KZCgiLmhpc3Rvcnktc2VhcmNoLWNvbnRyb2xzIiksbj0z
RChqUXVlcnkudHlwZShtKT0zRD0zRD0zRCJudW1iZXIiKT8obSk6KHRoPQppcy5meFNwZWVkKTtr
PTNEKGshPTNEPTNEdW5kZWZpbmVkKT8oayk6KCFsLmlzKCI6dmlzaWJsZSIpKTtpZihrKXtsLnNs
aWRlRG89CnduKG4sZnVuY3Rpb24oKXskKHRoaXMpLmZpbmQoImlucHV0IikuZm9jdXMoKX0pfWVs
c2V7bC5zbGlkZVVwKG4pfXJldHVybiBrfT0KLHNlYXJjaEhkYXM6ZnVuY3Rpb24oayl7dmFyIGw9
M0R0aGlzO3RoaXMuc2VhcmNoRm9yPTNEazt0aGlzLmZpbHRlcnM9M0RbZnVuPQpjdGlvbihtKXty
ZXR1cm4gbS5tYXRjaGVzQWxsKGwuc2VhcmNoRm9yKX1dO3RoaXMudHJpZ2dlcigic2VhcmNoOnNl
YXJjaGluZyI9CixrLHRoaXMpO3RoaXMucmVuZGVySGRhcygpO3JldHVybiB0aGlzfSxjbGVhckhk
YVNlYXJjaDpmdW5jdGlvbihrKXt0aGlzLnNlYT0KcmNoRm9yPTNEIiI7dGhpcy5maWx0ZXJzPTNE
W107dGhpcy50cmlnZ2VyKCJzZWFyY2g6Y2xlYXIiLHRoaXMpO3RoaXMucmVuZGVyPQpIZGFzKCk7
cmV0dXJuIHRoaXN9LF9zaG93TG9hZGluZ0luZGljYXRvcjpmdW5jdGlvbihsLGssbSl7az0zRChr
IT0zRD0zRHVuZGU9CmZpbmVkKT8oayk6KHRoaXMuZnhTcGVlZCk7aWYoIXRoaXMuaW5kaWNhdG9y
KXt0aGlzLmluZGljYXRvcj0zRG5ldyBMb2FkaW5nST0KbmRpY2F0b3IodGhpcy4kZWwsdGhpcy4k
ZWwucGFyZW50KCkpfWlmKCF0aGlzLiRlbC5pcygiOnZpc2libGUiKSl7dGhpcy5pbmRpPQpjYXRv
ci5zaG93KDAsbSl9ZWxzZXt0aGlzLiRlbC5mYWRlT3V0KGspO3RoaXMuaW5kaWNhdG9yLnNob3co
bCxrLG0pfX0sX2hpZGU9CkxvYWRpbmdJbmRpY2F0b3I6ZnVuY3Rpb24oayxsKXtrPTNEKGshPTNE
PTNEdW5kZWZpbmVkKT8oayk6KHRoaXMuZnhTcGVlZCk7aT0KZih0aGlzLmluZGljYXRvcil7dGhp
cy5pbmRpY2F0b3IuaGlkZShrLGwpfX0sZGlzcGxheU1lc3NhZ2U6ZnVuY3Rpb24ocCxxLG8pPQp7
dmFyIG09M0R0aGlzO3RoaXMuc2Nyb2xsVG9Ub3AoKTt2YXIgbj0zRHRoaXMuJG1lc3NhZ2VzKCks
az0zRCQoIjxkaXYvPiIpLmE9CmRkQ2xhc3MocCsibWVzc2FnZSIpLmh0bWwocSk7aWYoIV8uaXNF
bXB0eShvKSl7dmFyIGw9M0QkKCc8YSBocmVmPTNEImphdmFzYz0KcmlwdDp2b2lkKDApIj5EZXRh
aWxzPC9hPicpLmNsaWNrKGZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFsLnNob3cobS5fbWVzc2FnZVRv
PQpNb2RhbE9wdGlvbnMocCxxLG8pKTtyZXR1cm4gZmFsc2V9KTtrLmFwcGVuZCgiICIsbCl9cmV0
dXJuIG4uaHRtbChrKX0sX21lc3M9CmFnZVRvTW9kYWxPcHRpb25zOmZ1bmN0aW9uKG8scSxuKXt2
YXIgaz0zRHRoaXMscD0zRCQoIjxkaXYvPiIpLG09M0R7dGl0bGU6Ij0KRGV0YWlscyJ9O2Z1bmN0
aW9uIGwocil7cj0zRF8ub21pdChyLF8uZnVuY3Rpb25zKHIpKTtyZXR1cm5bIjx0YWJsZT4iLF8u
bWFwPQoocixmdW5jdGlvbih0LHMpe3Q9M0QoXy5pc09iamVjdCh0KSk/KGwodCkpOih0KTtyZXR1
cm4nPHRyPjx0ZCBzdHlsZT0zRCJ2ZXI9CnRpY2FsLWFsaWduOiB0b3A7IGNvbG9yOiBncmV5Ij4n
K3MrJzwvdGQ+PHRkIHN0eWxlPTNEInBhZGRpbmctbGVmdDogOHB4Ij4nKz0KdCsiPC90ZD48L3Ry
PiJ9KS5qb2luKCIiKSwiPC90YWJsZT4iXS5qb2luKCIiKX1pZihfLmlzT2JqZWN0KG4pKXttLmJv
ZHk9M0RwPQouYXBwZW5kKGwobikpfWVsc2V7bS5ib2R5PTNEcC5odG1sKG4pfW0uYnV0dG9ucz0z
RHtPazpmdW5jdGlvbigpe0dhbGF4eS5tb2Q9CmFsLmhpZGUoKTtrLmNsZWFyTWVzc2FnZXMoKX19
O3JldHVybiBtfSxjbGVhck1lc3NhZ2VzOmZ1bmN0aW9uKCl7dGhpcy4kbWVzcz0KYWdlcygpLmVt
cHR5KCk7cmV0dXJuIHRoaXN9LHNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
JGNvbnRhaW5lPQpyKCkuc2Nyb2xsVG9wKCl9LHNjcm9sbFRvOmZ1bmN0aW9uKGspe3RoaXMuJGNv
bnRhaW5lcigpLnNjcm9sbFRvcChrKTtyZXR1cm49CiB0aGlzfSxzY3JvbGxUb1RvcDpmdW5jdGlv
bigpe3RoaXMuJGNvbnRhaW5lcigpLnNjcm9sbFRvcCgwKTtyZXR1cm4gdGhpc30scz0KY3JvbGxU
b0lkOmZ1bmN0aW9uKGwpe2lmKCghbCl8fCghdGhpcy5oZGFWaWV3c1tsXSkpe3JldHVybiB0aGlz
fXZhciBrPTNEdGhpPQpzLmhkYVZpZXdzW2xdO3RoaXMuc2Nyb2xsVG8oay5lbC5vZmZzZXRUb3Ap
O3JldHVybiB0aGlzfSxzY3JvbGxUb0hpZDpmdW5jdGk9Cm9uKGspe3ZhciBsPTNEdGhpcy5tb2Rl
bC5oZGFzLmdldEJ5SGlkKGspO2lmKCFsKXtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5zYz0Kcm9s
bFRvSWQobC5pZCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIlJlYWRPbmx5SGlzdG9yeVBh
bmVsKCIrKCh0aGlzLm1vPQpkZWwpPyh0aGlzLm1vZGVsLmdldCgibmFtZSIpKTooIiIpKSsiKSJ9
fSk7dmFyIGo9M0RbJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS09CmNvbnRyb2xzIj4nLCc8ZGl2IGNs
YXNzPTNEImhpc3Rvcnktc2VhcmNoLWNvbnRyb2xzIj4nLCc8ZGl2IGNsYXNzPTNEImhpc3Rvcj0K
eS1zZWFyY2gtaW5wdXQiPjwvZGl2PicsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS10
aXRsZSI+JywiPCUgaWYoIGhpPQpzdG9yeS5uYW1lICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJoaXN0
b3J5LW5hbWUiPjwlPTNEIGhpc3RvcnkubmFtZSAlPjwvZGl2Pic9CiwiPCUgfSAlPiIsIjwvZGl2
PiIsJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS1zdWJ0aXRsZSBjbGVhciI+JywiPCUgaWYoIGhpc3Rv
cj0KeS5uaWNlX3NpemUgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImhpc3Rvcnktc2l6ZSI+PCU9M0Qg
aGlzdG9yeS5uaWNlX3NpemUgJT48PQovZGl2PicsIjwlIH0gJT4iLCc8ZGl2IGNsYXNzPTNEImhp
c3Rvcnktc2Vjb25kYXJ5LWFjdGlvbnMiPjwvZGl2PicsIjwvZGl2PiI9CiwiPCUgaWYoIGhpc3Rv
cnkuZGVsZXRlZCApeyAlPiIsJzxkaXYgY2xhc3M9M0Qid2FybmluZ21lc3NhZ2VzbWFsbCI+PHN0
cm9uZz0KPicsX2woIllvdSBhcmUgY3VycmVudGx5IHZpZXdpbmcgYSBkZWxldGVkIGhpc3Rvcnkh
IiksIjwvc3Ryb25nPjwvZGl2PiIsIjwlPQogfSAlPiIsJzxkaXYgY2xhc3M9M0QibWVzc2FnZS1j
b250YWluZXIiPicsIjwlIGlmKCBoaXN0b3J5Lm1lc3NhZ2UgKXsgJT4iLCc9CjxkaXYgY2xhc3M9
M0QiPCU9M0QgaGlzdG9yeS5zdGF0dXMgJT5tZXNzYWdlIj48JT0zRCBoaXN0b3J5Lm1lc3NhZ2Ug
JT48L2Rpdj0KPicsIjwlIH0gJT4iLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEInF1b3RhLW1lc3Nh
Z2UgZXJyb3JtZXNzYWdlIj4nLF9sKCJZb3UgPQphcmUgb3ZlciB5b3VyIGRpc2sgcXVvdGEuIiks
X2woIlRvb2wgZXhlY3V0aW9uIGlzIG9uIGhvbGQgdW50aWwgeW91ciBkaXNrIHU9CnNhZ2UgZHJv
cHMgYmVsb3cgeW91ciBhbGxvY2F0ZWQgcXVvdGEuIiksIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0Qi
dGFncy1kaXNwbD0KYXkiPjwvZGl2PicsJzxkaXYgY2xhc3M9M0QiYW5ub3RhdGlvbi1kaXNwbGF5
Ij48L2Rpdj4nLCc8ZGl2IGNsYXNzPTNEImhpc3RvPQpyeS1kYXRhc2V0LWFjdGlvbnMiPicsJzxk
aXYgY2xhc3M9M0QiYnRuLWdyb3VwIj4nLCc8YnV0dG9uIGNsYXNzPTNEImhpc3Rvcnk9Ci1zZWxl
Y3QtYWxsLWRhdGFzZXRzLWJ0biBidG4gYnRuLWRlZmF1bHQiJywnZGF0YS1tb2RlPTNEInNlbGVj
dCI+JyxfbCgiQWxsIj0KKSwiPC9idXR0b24+IiwnPGJ1dHRvbiBjbGFzcz0zRCJoaXN0b3J5LWRl
c2VsZWN0LWFsbC1kYXRhc2V0cy1idG4gYnRuIGJ0bi1kPQplZmF1bHQiJywnZGF0YS1tb2RlPTNE
InNlbGVjdCI+JyxfbCgiTm9uZSIpLCI8L2J1dHRvbj4iLCI8L2Rpdj4iLCc8YnV0dG9uIGM9Cmxh
c3M9M0QiaGlzdG9yeS1kYXRhc2V0LWFjdGlvbi1wb3B1cC1idG4gYnRuIGJ0bi1kZWZhdWx0Ij4n
LF9sKCJGb3IgYWxsIHNlbD0KZWN0ZWQiKSwiLi4uPC9idXR0b24+IiwiPC9kaXY+IiwiPC9kaXY+
IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0cy1saXN0Ij48L2RpPQp2PicsJzxkaXYgY2xhc3M9M0Qi
ZW1wdHktaGlzdG9yeS1tZXNzYWdlIGluZm9tZXNzYWdlc21hbGwiPicsX2woIllvdXIgaGlzdG89
CnJ5IGlzIGVtcHR5LiBDbGljayAnR2V0IERhdGEnIG9uIHRoZSBsZWZ0IHBhbmUgdG8gc3RhcnQi
KSwiPC9kaXY+Il0uam9pbigiIj0KKTtpLnRlbXBsYXRlcz0zRHtoaXN0b3J5UGFuZWw6ZnVuY3Rp
b24oayl7cmV0dXJuIF8udGVtcGxhdGUoaixrLHt2YXJpYWJsZToiPQpoaXN0b3J5In0pfX07cmV0
dXJue1JlYWRPbmx5SGlzdG9yeVBhbmVsOml9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls
ZQorZGVmaW5lKFsibXZjL2hpc3RvcnkvaGlzdG9yeS1tb2RlbCIsIm12Yy9kYXRhc2V0L2hkYS1i
YXNlIiwibXZjL3VzZXIvdXNlci09Cm1vZGVsIiwibXZjL2Jhc2UtbXZjIiwidXRpbHMvbG9jYWxp
emF0aW9uIl0sZnVuY3Rpb24oZyxiLGEsZixkKXt2YXIgaT0zRGYuUz0KZXNzaW9uU3RvcmFnZU1v
ZGVsLmV4dGVuZCh7ZGVmYXVsdHM6e2V4cGFuZGVkSGRhczp7fSxzaG93X2RlbGV0ZWQ6ZmFsc2Us
c2hvPQp3X2hpZGRlbjpmYWxzZX0sYWRkRXhwYW5kZWRIZGE6ZnVuY3Rpb24obSl7dmFyIGw9M0Qi
ZXhwYW5kZWRIZGFzIjt0aGlzLnNhdmU9CihsLF8uZXh0ZW5kKHRoaXMuZ2V0KGwpLF8ub2JqZWN0
KFttXSxbdHJ1ZV0pKSl9LHJlbW92ZUV4cGFuZGVkSGRhOmZ1bmN0aW9uKD0KbSl7dmFyIGw9M0Qi
ZXhwYW5kZWRIZGFzIjt0aGlzLnNhdmUobCxfLm9taXQodGhpcy5nZXQobCksbSkpfSx0b1N0cmlu
ZzpmdW5jPQp0aW9uKCl7cmV0dXJuIkhpc3RvcnlQcmVmcygiK3RoaXMuaWQrIikifX0pO2kuc3Rv
cmFnZUtleVByZWZpeD0zRCJoaXN0b3J5OiI9CjtpLmhpc3RvcnlTdG9yYWdlS2V5PTNEZnVuY3Rp
b24gZShsKXtpZighbCl7dGhyb3cgbmV3IEVycm9yKCJIaXN0b3J5UHJlZnMuaD0KaXN0b3J5U3Rv
cmFnZUtleSBuZWVkcyB2YWxpZCBpZDogIitsKX1yZXR1cm4oaS5zdG9yYWdlS2V5UHJlZml4K2wp
fTtpLmdldD0KPTNEZnVuY3Rpb24gYyhsKXtyZXR1cm4gbmV3IGkoe2lkOmkuaGlzdG9yeVN0b3Jh
Z2VLZXkobCl9KX07aS5jbGVhckFsbD0zRGZ1PQpuY3Rpb24gaChtKXtmb3IodmFyIGwgaW4gc2Vz
c2lvblN0b3JhZ2Upe2lmKGwuaW5kZXhPZihpLnN0b3JhZ2VLZXlQcmVmaXgpPQo9M0Q9M0Q9M0Qw
KXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGwpfX19O3ZhciBqPTNEQmFja2JvbmUuVmlldy5l
eHRlbmQoZi49CkxvZ2dhYmxlTWl4aW4pLmV4dGVuZCh7SERBVmlld0NsYXNzOmIuSERBQmFzZVZp
ZXcsdGFnTmFtZToiZGl2IixjbGFzc05hbWU6Ij0KaGlzdG9yeS1wYW5lbCIsZnhTcGVlZDoiZmFz
dCIsZW1wdHlNc2c6ZCgiVGhpcyBoaXN0b3J5IGlzIGVtcHR5Iiksbm9uZUZvdW5kPQpNc2c6ZCgi
Tm8gbWF0Y2hpbmcgZGF0YXNldHMgZm91bmQiKSxpbml0aWFsaXplOmZ1bmN0aW9uKGwpe2w9M0Rs
fHx7fTtpZihsLmw9Cm9nZ2VyKXt0aGlzLmxvZ2dlcj0zRGwubG9nZ2VyfXRoaXMubG9nKHRoaXMr
Ii5pbml0aWFsaXplOiIsbCk7dGhpcy5saW5rVGFyZz0KZXQ9M0RsLmxpbmtUYXJnZXR8fCJfYmxh
bmsiO3RoaXMuZnhTcGVlZD0zRF8uaGFzKGwsImZ4U3BlZWQiKT8obC5meFNwZWVkKTooPQp0aGlz
LmZ4U3BlZWQpO3RoaXMuZmlsdGVycz0zRFtdO3RoaXMuc2VhcmNoRm9yPTNEIiI7dGhpcy5maW5k
Q29udGFpbmVyRm49M0Q9CmwuZmluZENvbnRhaW5lckZuO3RoaXMuaGRhVmlld3M9M0R7fTt0aGlz
LmluZGljYXRvcj0zRG5ldyBMb2FkaW5nSW5kaWNhdG9yKD0KdGhpcy4kZWwpO3RoaXMuX3NldFVw
TGlzdGVuZXJzKCk7dmFyIG09M0RfLnBpY2sobCwiaW5pdGlhbGx5RXhwYW5kZWQiLCJzaG93PQpf
ZGVsZXRlZCIsInNob3dfaGlkZGVuIik7dGhpcy5zZXRNb2RlbCh0aGlzLm1vZGVsLG0sZmFsc2Up
O2lmKGwub25yZWFkeSl7bC49Cm9ucmVhZHkuY2FsbCh0aGlzKX19LF9zZXRVcExpc3RlbmVyczpm
dW5jdGlvbigpe3RoaXMub24oImVycm9yIixmdW5jdGlvbihtLD0KcCxsLG8sbil7dGhpcy5lcnJv
ckhhbmRsZXIobSxwLGwsbyxuKX0pO3RoaXMub24oImxvYWRpbmctaGlzdG9yeSIsZnVuY3Rpb24o
PQope3RoaXMuX3Nob3dMb2FkaW5nSW5kaWNhdG9yKCJsb2FkaW5nIGhpc3RvcnkuLi4iLDQwKX0p
O3RoaXMub24oImxvYWRpbmctZG89Cm5lIixmdW5jdGlvbigpe3RoaXMuX2hpZGVMb2FkaW5nSW5k
aWNhdG9yKDQwKTtpZihfLmlzRW1wdHkodGhpcy5oZGFWaWV3cykpez0KdGhpcy50cmlnZ2VyKCJl
bXB0eS1oaXN0b3J5Iix0aGlzKX19KTt0aGlzLm9uY2UoInJlbmRlcmVkIixmdW5jdGlvbigpe3Ro
aXMuPQp0cmlnZ2VyKCJyZW5kZXJlZDppbml0aWFsIix0aGlzKTtyZXR1cm4gZmFsc2V9KTtpZih0
aGlzLmxvZ2dlcil7dGhpcy5vbigiYWw9CmwiLGZ1bmN0aW9uKGwpe3RoaXMubG9nKHRoaXMrIiIs
YXJndW1lbnRzKX0sdGhpcyl9cmV0dXJuIHRoaXN9LGVycm9ySGFuZGxlcj0KOmZ1bmN0aW9uKG4s
cSxtLHAsbyl7Y29uc29sZS5lcnJvcihuLHEsbSxwLG8pO2lmKHEmJnEuc3RhdHVzPTNEPTNEPTNE
MCYmcS5yPQplYWR5U3RhdGU9M0Q9M0Q9M0QwKXt9ZWxzZXtpZihxJiZxLnN0YXR1cz0zRD0zRD0z
RDUwMil7fWVsc2V7dmFyIGw9M0R0aGlzLl89CnBhcnNlRXJyb3JNZXNzYWdlKG4scSxtLHAsbyk7
aWYoIXRoaXMuJG1lc3NhZ2VzKCkuaXMoIjp2aXNpYmxlIikpe3RoaXMub25jZT0KKCJyZW5kZXJl
ZCIsZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXlNZXNzYWdlKCJlcnJvciIsbC5tZXNzYWdlLGwuZGV0
YWlscyl9KX1lPQpsc2V7dGhpcy5kaXNwbGF5TWVzc2FnZSgiZXJyb3IiLGwubWVzc2FnZSxsLmRl
dGFpbHMpfX19fSxfcGFyc2VFcnJvck1lc3NhZ2U9CjpmdW5jdGlvbihvLHMsbixyLHEpe3ZhciBt
PTNER2FsYXh5LmN1cnJVc2VyLGw9M0R7bWVzc2FnZTp0aGlzLl9iZVBvbGl0ZShyKT0KLGRldGFp
bHM6e3VzZXI6KG0gaW5zdGFuY2VvZiBhLlVzZXIpPyhtLnRvSlNPTigpKToobSsiIiksc291cmNl
OihvIGluc3RhbmNlPQpvZiBCYWNrYm9uZS5Nb2RlbCk/KG8udG9KU09OKCkpOihvKyIiKSx4aHI6
cyxvcHRpb25zOihzKT8oXy5vbWl0KG4sInhociIpKTo9CihuKX19O18uZXh0ZW5kKGwuZGV0YWls
cyxxfHx7fSk7aWYocyYmXy5pc0Z1bmN0aW9uKHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKT0KKXt2
YXIgcD0zRHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7cD0zRF8uY29tcGFjdChwLnNwbGl0KCJc
biIpKTtwPTNEXy5tYXAoPQpwLGZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCI6ICIpfSk7bC5k
ZXRhaWxzLnhoci5yZXNwb25zZUhlYWRlcnM9M0RfLm9iamU9CmN0KHApfXJldHVybiBsfSxfYmVQ
b2xpdGU6ZnVuY3Rpb24obCl7bD0zRGx8fGQoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGdldD0K
dGluZyB1cGRhdGVzIGZyb20gdGhlIHNlcnZlciIpO3JldHVybiBsKyIuICIrZCgiUGxlYXNlIGNv
bnRhY3QgYSBHYWxheHkgYWRtPQppbmlzdHJhdG9yIGlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLiIp
fSxsb2FkSGlzdG9yeVdpdGhIREFEZXRhaWxzOmZ1bmN0aW9uKG49CixtLGwscCl7dmFyIG89M0Rm
dW5jdGlvbihxKXtyZXR1cm4gXy5rZXlzKGkuZ2V0KHEuaWQpLmdldCgiZXhwYW5kZWRIZGFzIikp
fT0KO3JldHVybiB0aGlzLmxvYWRIaXN0b3J5KG4sbSxsLHAsbyl9LGxvYWRIaXN0b3J5OmZ1bmN0
aW9uKG8sbixtLHIscCl7dmFyIGw9Cj0zRHRoaXM7bj0zRG58fHt9O2wudHJpZ2dlcigibG9hZGlu
Zy1oaXN0b3J5IixsKTt2YXIgcT0zRGcuSGlzdG9yeS5nZXRIaXN0bz0KcnlEYXRhKG8se2hpc3Rv
cnlGbjptLGhkYUZuOnIsaGRhRGV0YWlsSWRzOm4uaW5pdGlhbGx5RXhwYW5kZWR8fHB9KTtyZXR1
cm4gPQpsLl9sb2FkSGlzdG9yeUZyb21YSFIocSxuKS5mYWlsKGZ1bmN0aW9uKHUscyx0KXtsLnRy
aWdnZXIoImVycm9yIixsLHUsbixkKCI9CkFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSAi
K3MpLHtoaXN0b3J5SWQ6byxoaXN0b3J5OnR8fHt9fSl9KS5hbHdheXMoZj0KdW5jdGlvbigpe2wu
dHJpZ2dlcigibG9hZGluZy1kb25lIixsKX0pfSxfbG9hZEhpc3RvcnlGcm9tWEhSOmZ1bmN0aW9u
KG4sbSl7PQp2YXIgbD0zRHRoaXM7bi50aGVuKGZ1bmN0aW9uKG8scCl7bC5KU09OVG9Nb2RlbChv
LHAsbSl9KTtuLmZhaWwoZnVuY3Rpb24ocCw9Cm8pe2wucmVuZGVyKCl9KTtyZXR1cm4gbn0sSlNP
TlRvTW9kZWw6ZnVuY3Rpb24obyxsLG0pe3RoaXMubG9nKCJKU09OVG9Nb2RlbD0KOiIsbyxsLG0p
O209M0RtfHx7fTt2YXIgbj0zRG5ldyBnLkhpc3RvcnkobyxsLG0pO3RoaXMuc2V0TW9kZWwobik7
cmV0dXJuIHRoPQppc30sc2V0TW9kZWw6ZnVuY3Rpb24obSxsLG4pe2w9M0RsfHx7fTtuPTNEKG4h
PTNEPTNEdW5kZWZpbmVkKT8obik6KHRydWUpO3Q9Cmhpcy5sb2coInNldE1vZGVsOiIsbSxsLG4p
O3RoaXMuZnJlZU1vZGVsKCk7dGhpcy5zZWxlY3RlZEhkYUlkcz0zRFtdO2lmKG0pez0KdGhpcy5t
b2RlbD0zRG07aWYodGhpcy5sb2dnZXIpe3RoaXMubW9kZWwubG9nZ2VyPTNEdGhpcy5sb2dnZXJ9
dGhpcy5fc2V0VXBXPQplYlN0b3JhZ2UobC5pbml0aWFsbHlFeHBhbmRlZCxsLnNob3dfZGVsZXRl
ZCxsLnNob3dfaGlkZGVuKTt0aGlzLl9zZXRVcE1vZGU9CmxFdmVudEhhbmRsZXJzKCk7dGhpcy50
cmlnZ2VyKCJuZXctbW9kZWwiLHRoaXMpfWlmKG4pe3RoaXMucmVuZGVyKCl9cmV0dXJuID0KdGhp
c30sZnJlZU1vZGVsOmZ1bmN0aW9uKCl7aWYodGhpcy5tb2RlbCl7dGhpcy5tb2RlbC5jbGVhclVw
ZGF0ZVRpbWVvdXQoKTt0PQpoaXMuc3RvcExpc3RlbmluZyh0aGlzLm1vZGVsKTt0aGlzLnN0b3BM
aXN0ZW5pbmcodGhpcy5tb2RlbC5oZGFzKX10aGlzLmZyZWU9CkhkYVZpZXdzKCk7cmV0dXJuIHRo
aXN9LGZyZWVIZGFWaWV3czpmdW5jdGlvbigpe3RoaXMuaGRhVmlld3M9M0R7fTtyZXR1cm4gdD0K
aGlzfSxfc2V0VXBXZWJTdG9yYWdlOmZ1bmN0aW9uKG0sbCxuKXt0aGlzLnN0b3JhZ2U9M0RuZXcg
aSh7aWQ6aS5oaXN0b3J5U3RvPQpyYWdlS2V5KHRoaXMubW9kZWwuZ2V0KCJpZCIpKX0pO2lmKF8u
aXNPYmplY3QobSkpe3RoaXMuc3RvcmFnZS5zZXQoImV4YW5kZWQ9CkhkYXMiLG0pfWlmKF8uaXNC
b29sZWFuKGwpKXt0aGlzLnN0b3JhZ2Uuc2V0KCJzaG93X2RlbGV0ZWQiLGwpfWlmKF8uaXNCb29s
ZT0KYW4obikpe3RoaXMuc3RvcmFnZS5zZXQoInNob3dfaGlkZGVuIixuKX10aGlzLnRyaWdnZXIo
Im5ldy1zdG9yYWdlIix0aGlzLnN0PQpvcmFnZSx0aGlzKTt0aGlzLmxvZyh0aGlzKyIgKGluaXQn
ZCkgc3RvcmFnZToiLHRoaXMuc3RvcmFnZS5nZXQoKSk7cmV0dXJuIHQ9Cmhpc30sX3NldFVwTW9k
ZWxFdmVudEhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5tb2RlbC5oZGFzLm9uKCJhZGQiLHRoaXMu
YWRkSD0KZGFWaWV3LHRoaXMpO3RoaXMubW9kZWwub24oImVycm9yIGVycm9yOmhkYXMiLGZ1bmN0
aW9uKG0sbyxsLG4pe3RoaXMuZXJyb3JIPQphbmRsZXIobSxvLGwsbil9LHRoaXMpO3JldHVybiB0
aGlzfSxyZW5kZXI6ZnVuY3Rpb24obixvKXt0aGlzLmxvZygicmVuZGVyOiI9CixuLG8pO249M0Qo
bj0zRD0zRD0zRHVuZGVmaW5lZCk/KHRoaXMuZnhTcGVlZCk6KG4pO3ZhciBsPTNEdGhpcyxtO2lm
KHRoaXMubT0Kb2RlbCl7bT0zRHRoaXMucmVuZGVyTW9kZWwoKX1lbHNle209M0R0aGlzLnJlbmRl
cldpdGhvdXRNb2RlbCgpfSQobCkucXVldWUoPQoiZngiLFtmdW5jdGlvbihwKXtpZihuJiZsLiRl
bC5pcygiOnZpc2libGUiKSl7bC4kZWwuZmFkZU91dChuLHApfWVsc2V7cCgpfX09CixmdW5jdGlv
bihwKXtsLiRlbC5lbXB0eSgpO2lmKG0pe2wuJGVsLmFwcGVuZChtLmNoaWxkcmVuKCkpfXAoKX0s
ZnVuY3Rpb24ocD0KKXtpZihuJiYhbC4kZWwuaXMoIjp2aXNpYmxlIikpe2wuJGVsLmZhZGVJbihu
LHApfWVsc2V7cCgpfX0sZnVuY3Rpb24ocCl7aWYoPQpvKXtvLmNhbGwodGhpcyl9bC50cmlnZ2Vy
KCJyZW5kZXJlZCIsdGhpcyk7cCgpfV0pO3JldHVybiB0aGlzfSxyZW5kZXJXaXRob3U9CnRNb2Rl
bDpmdW5jdGlvbigpe3ZhciBsPTNEJCgiPGRpdi8+IiksbT0zRCQoIjxkaXYvPiIpLmFkZENsYXNz
KCJtZXNzYWdlLWNvbj0KdGFpbmVyIikuY3NzKHttYXJnaW46IjRweCJ9KTtyZXR1cm4gbC5hcHBl
bmQobSl9LHJlbmRlck1vZGVsOmZ1bmN0aW9uKCl7dmFyPQogbD0zRCQoIjxkaXYvPiIpO2wuYXBw
ZW5kKGoudGVtcGxhdGVzLmhpc3RvcnlQYW5lbCh0aGlzLm1vZGVsLnRvSlNPTigpKSk7dGg9Cmlz
LiRlbXB0eU1lc3NhZ2UobCkudGV4dCh0aGlzLmVtcHR5TXNnKTtsLmZpbmQoIi5oaXN0b3J5LXNl
Y29uZGFyeS1hY3Rpb25zIj0KKS5wcmVwZW5kKHRoaXMuX3JlbmRlclNlYXJjaEJ1dHRvbigpKTt0
aGlzLl9zZXRVcEJlaGF2aW91cnMobCk7dGhpcy5yZW5kZXJIPQpkYXMobCk7cmV0dXJuIGx9LF9y
ZW5kZXJFbXB0eU1zZzpmdW5jdGlvbihuKXt2YXIgbT0zRHRoaXMsbD0zRG0uJGVtcHR5TWVzc2E9
CmdlKG4pO2lmKCFfLmlzRW1wdHkobS5oZGFWaWV3cykpe2wuaGlkZSgpfWVsc2V7aWYobS5zZWFy
Y2hGb3Ipe2wudGV4dChtLm5vbj0KZUZvdW5kTXNnKS5zaG93KCl9ZWxzZXtsLnRleHQobS5lbXB0
eU1zZykuc2hvdygpfX1yZXR1cm4gdGhpc30sX3JlbmRlclNlYXJjPQpoQnV0dG9uOmZ1bmN0aW9u
KGwpe3JldHVybiBmYUljb25CdXR0b24oe3RpdGxlOmQoIlNlYXJjaCBkYXRhc2V0cyIpLGNsYXNz
ZXM9CjoiaGlzdG9yeS1zZWFyY2gtYnRuIixmYUljb246ImZhLXNlYXJjaCJ9KX0sX3NldFVwQmVo
YXZpb3VyczpmdW5jdGlvbihsKXtsPQo9M0RsfHx0aGlzLiRlbDtsLmZpbmQoIlt0aXRsZV0iKS50
b29sdGlwKHtwbGFjZW1lbnQ6ImJvdHRvbSJ9KTt0aGlzLl9zZXRVcFM9CmVhcmNoSW5wdXQobC5m
aW5kKCIuaGlzdG9yeS1zZWFyY2gtY29udHJvbHMgLmhpc3Rvcnktc2VhcmNoLWlucHV0IikpO3Jl
dHVybj0KIHRoaXN9LCRjb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5maW5kQ29udGFp
bmVyRm4pPyh0aGlzLmZpbmRDb250YWluPQplckZuLmNhbGwodGhpcykpOih0aGlzLiRlbC5wYXJl
bnQoKSl9LCRkYXRhc2V0c0xpc3Q6ZnVuY3Rpb24obCl7cmV0dXJuKGx8fHQ9Cmhpcy4kZWwpLmZp
bmQoIi5kYXRhc2V0cy1saXN0Iil9LCRtZXNzYWdlczpmdW5jdGlvbihsKXtyZXR1cm4obHx8dGhp
cy4kZWwpLj0KZmluZCgiLm1lc3NhZ2UtY29udGFpbmVyIil9LCRlbXB0eU1lc3NhZ2U6ZnVuY3Rp
b24obCl7cmV0dXJuKGx8fHRoaXMuJGVsKS5mPQppbmQoIi5lbXB0eS1oaXN0b3J5LW1lc3NhZ2Ui
KX0scmVuZGVySGRhczpmdW5jdGlvbihtKXttPTNEbXx8dGhpcy4kZWw7dmFyIGw9Cj0zRHRoaXMs
bz0zRHt9LG49M0R0aGlzLm1vZGVsLmhkYXMuZ2V0VmlzaWJsZSh0aGlzLnN0b3JhZ2UuZ2V0KCJz
aG93X2RlbGV0ZT0KZCIpLHRoaXMuc3RvcmFnZS5nZXQoInNob3dfaGlkZGVuIiksdGhpcy5maWx0
ZXJzKTt0aGlzLiRkYXRhc2V0c0xpc3QobSkuZW1wPQp0eSgpO2lmKG4ubGVuZ3RoKXtuLmVhY2go
ZnVuY3Rpb24ocSl7dmFyIHA9M0RxLmdldCgiaWQiKSxyPTNEbC5fY3JlYXRlSGRhVmk9CmV3KHEp
O29bcF09M0RyO2lmKF8uY29udGFpbnMobC5zZWxlY3RlZEhkYUlkcyxwKSl7ci5zZWxlY3RlZD0z
RHRydWV9bC5hdHRhYz0KaEhkYVZpZXcoci5yZW5kZXIoKSxtKX0pfXRoaXMuaGRhVmlld3M9M0Rv
O3RoaXMuX3JlbmRlckVtcHR5TXNnKG0pO3JldHVybiB0PQpoaXMuaGRhVmlld3N9LF9jcmVhdGVI
ZGFWaWV3OmZ1bmN0aW9uKG0pe3ZhciBsPTNEbS5nZXQoImlkIiksbj0zRG5ldyB0aGlzLkg9CkRB
Vmlld0NsYXNzKHttb2RlbDptLGxpbmtUYXJnZXQ6dGhpcy5saW5rVGFyZ2V0LGV4cGFuZGVkOnRo
aXMuc3RvcmFnZS5nZXQoIj0KZXhwYW5kZWRIZGFzIilbbF0saGFzVXNlcjp0aGlzLm1vZGVsLm93
bmVkQnlDdXJyVXNlcigpLGxvZ2dlcjp0aGlzLmxvZ2dlcn0pPQo7dGhpcy5fc2V0VXBIZGFMaXN0
ZW5lcnMobik7cmV0dXJuIG59LF9zZXRVcEhkYUxpc3RlbmVyczpmdW5jdGlvbihtKXt2YXIgbD0K
PTNEdGhpczttLm9uKCJlcnJvciIsZnVuY3Rpb24obyxxLG4scCl7bC5lcnJvckhhbmRsZXIobyxx
LG4scCl9KTttLm9uKCJib2R5PQotZXhwYW5kZWQiLGZ1bmN0aW9uKG4pe2wuc3RvcmFnZS5hZGRF
eHBhbmRlZEhkYShuKX0pO20ub24oImJvZHktY29sbGFwc2VkIiw9CmZ1bmN0aW9uKG4pe2wuc3Rv
cmFnZS5yZW1vdmVFeHBhbmRlZEhkYShuKX0pO3JldHVybiB0aGlzfSxhdHRhY2hIZGFWaWV3OmZ1
bj0KY3Rpb24obixtKXttPTNEbXx8dGhpcy4kZWw7dmFyIGw9M0R0aGlzLiRkYXRhc2V0c0xpc3Qo
bSk7bC5wcmVwZW5kKG4uJGVsKTtyPQpldHVybiB0aGlzfSxhZGRIZGFWaWV3OmZ1bmN0aW9uKG8p
e3RoaXMubG9nKCJhZGQuIit0aGlzLG8pO3ZhciBtPTNEdGhpcztpZig9CiFvLmlzVmlzaWJsZSh0
aGlzLnN0b3JhZ2UuZ2V0KCJzaG93X2RlbGV0ZWQiKSx0aGlzLnN0b3JhZ2UuZ2V0KCJzaG93X2hp
ZGRlbj0KIikpKXtyZXR1cm4gbX0kKHt9KS5xdWV1ZShbZnVuY3Rpb24gbihxKXt2YXIgcD0zRG0u
JGVtcHR5TWVzc2FnZSgpO2lmKHAuaXMoPQoiOnZpc2libGUiKSl7cC5mYWRlT3V0KG0uZnhTcGVl
ZCxxKX1lbHNle3EoKX19LGZ1bmN0aW9uIGwocCl7dmFyIHE9M0RtLl9jcmU9CmF0ZUhkYVZpZXco
byk7bS5oZGFWaWV3c1tvLmlkXT0zRHE7cS5yZW5kZXIoKS4kZWwuaGlkZSgpO20uc2Nyb2xsVG9U
b3AoKTttLj0KYXR0YWNoSGRhVmlldyhxKTtxLiRlbC5zbGlkZURvd24obS5meFNwZWVkKX1dKTty
ZXR1cm4gbX0scmVmcmVzaEhkYXM6ZnVuY3RpPQpvbihtLGwpe2lmKHRoaXMubW9kZWwpe3JldHVy
biB0aGlzLm1vZGVsLnJlZnJlc2gobSxsKX1yZXR1cm4gJC53aGVuKCl9LGV2ZW49CnRzOnsiY2xp
Y2sgLm1lc3NhZ2UtY29udGFpbmVyIjoiY2xlYXJNZXNzYWdlcyIsImNsaWNrIC5oaXN0b3J5LXNl
YXJjaC1idG4iOj0KInRvZ2dsZVNlYXJjaENvbnRyb2xzIn0sY29sbGFwc2VBbGxIZGFCb2RpZXM6
ZnVuY3Rpb24oKXtfLmVhY2godGhpcy5oZGFWaWV3PQpzLGZ1bmN0aW9uKGwpe2wudG9nZ2xlQm9k
eVZpc2liaWxpdHkobnVsbCxmYWxzZSl9KTt0aGlzLnN0b3JhZ2Uuc2V0KCJleHBhbmQ9CmVkSGRh
cyIse30pO3JldHVybiB0aGlzfSx0b2dnbGVTaG93RGVsZXRlZDpmdW5jdGlvbihsKXtsPTNEKGwh
PTNEPTNEdW5kZWZpbj0KZWQpPyhsKTooIXRoaXMuc3RvcmFnZS5nZXQoInNob3dfZGVsZXRlZCIp
KTt0aGlzLnN0b3JhZ2Uuc2V0KCJzaG93X2RlbGV0ZWQiPQosbCk7dGhpcy5yZW5kZXJIZGFzKCk7
cmV0dXJuIHRoaXMuc3RvcmFnZS5nZXQoInNob3dfZGVsZXRlZCIpfSx0b2dnbGVTaG93SGk9CmRk
ZW46ZnVuY3Rpb24obCl7bD0zRChsIT0zRD0zRHVuZGVmaW5lZCk/KGwpOighdGhpcy5zdG9yYWdl
LmdldCgic2hvd19oaWRkZT0KbiIpKTt0aGlzLnN0b3JhZ2Uuc2V0KCJzaG93X2hpZGRlbiIsbCk7
dGhpcy5yZW5kZXJIZGFzKCk7cmV0dXJuIHRoaXMuc3RvcmFnPQplLmdldCgic2hvd19oaWRkZW4i
KX0sX3NldFVwU2VhcmNoSW5wdXQ6ZnVuY3Rpb24obSl7dmFyIG49M0R0aGlzLG89M0QiLmhpc3Q9
Cm9yeS1zZWFyY2gtaW5wdXQiO2Z1bmN0aW9uIGwocCl7aWYobi5tb2RlbC5oZGFzLmhhdmVEZXRh
aWxzKCkpe24uc2VhcmNoSGRhcz0KKHApO3JldHVybn1uLiRlbC5maW5kKG8pLnNlYXJjaElucHV0
KCJ0b2dnbGUtbG9hZGluZyIpO24ubW9kZWwuaGRhcy5mZXRjaEFsPQpsRGV0YWlscyh7c2lsZW50
OnRydWV9KS5hbHdheXMoZnVuY3Rpb24oKXtuLiRlbC5maW5kKG8pLnNlYXJjaElucHV0KCJ0b2dn
bGU9Ci1sb2FkaW5nIil9KS5kb25lKGZ1bmN0aW9uKCl7bi5zZWFyY2hIZGFzKHApfSl9bS5zZWFy
Y2hJbnB1dCh7aW5pdGlhbFZhbDpuLj0Kc2VhcmNoRm9yLG5hbWU6Imhpc3Rvcnktc2VhcmNoIixw
bGFjZWhvbGRlcjoic2VhcmNoIGRhdGFzZXRzIixjbGFzc2VzOiJoaXN0PQpvcnktc2VhcmNoIixv
bmZpcnN0c2VhcmNoOmwsb25zZWFyY2g6Xy5iaW5kKHRoaXMuc2VhcmNoSGRhcyx0aGlzKSxvbmNs
ZWFyOl89Ci5iaW5kKHRoaXMuY2xlYXJIZGFTZWFyY2gsdGhpcyl9KTtyZXR1cm4gbX0sdG9nZ2xl
U2VhcmNoQ29udHJvbHM6ZnVuY3Rpb24obj0KLGwpe3ZhciBtPTNEdGhpcy4kZWwuZmluZCgiLmhp
c3Rvcnktc2VhcmNoLWNvbnRyb2xzIiksbz0zRChqUXVlcnkudHlwZShuKT0KPTNEPTNEPTNEIm51
bWJlciIpPyhuKToodGhpcy5meFNwZWVkKTtsPTNEKGwhPTNEPTNEdW5kZWZpbmVkKT8obCk6KCFt
LmlzKCI6PQp2aXNpYmxlIikpO2lmKGwpe20uc2xpZGVEb3duKG8sZnVuY3Rpb24oKXskKHRoaXMp
LmZpbmQoImlucHV0IikuZm9jdXMoKX0pfWU9CmxzZXttLnNsaWRlVXAobyl9cmV0dXJuIGx9LHNl
YXJjaEhkYXM6ZnVuY3Rpb24obCl7dmFyIG09M0R0aGlzO3RoaXMuc2VhcmNoRj0Kb3I9M0RsO3Ro
aXMuZmlsdGVycz0zRFtmdW5jdGlvbihuKXtyZXR1cm4gbi5tYXRjaGVzQWxsKG0uc2VhcmNoRm9y
KX1dO3RoaXMuPQp0cmlnZ2VyKCJzZWFyY2g6c2VhcmNoaW5nIixsLHRoaXMpO3RoaXMucmVuZGVy
SGRhcygpO3JldHVybiB0aGlzfSxjbGVhckhkYVM9CmVhcmNoOmZ1bmN0aW9uKGwpe3RoaXMuc2Vh
cmNoRm9yPTNEIiI7dGhpcy5maWx0ZXJzPTNEW107dGhpcy50cmlnZ2VyKCJzZWFyYz0KaDpjbGVh
ciIsdGhpcyk7dGhpcy5yZW5kZXJIZGFzKCk7cmV0dXJuIHRoaXN9LF9zaG93TG9hZGluZ0luZGlj
YXRvcjpmdW5jdGlvPQpuKG0sbCxuKXtsPTNEKGwhPTNEPTNEdW5kZWZpbmVkKT8obCk6KHRoaXMu
ZnhTcGVlZCk7aWYoIXRoaXMuaW5kaWNhdG9yKXt0aGk9CnMuaW5kaWNhdG9yPTNEbmV3IExvYWRp
bmdJbmRpY2F0b3IodGhpcy4kZWwsdGhpcy4kZWwucGFyZW50KCkpfWlmKCF0aGlzLiRlbD0KLmlz
KCI6dmlzaWJsZSIpKXt0aGlzLmluZGljYXRvci5zaG93KDAsbil9ZWxzZXt0aGlzLiRlbC5mYWRl
T3V0KGwpO3RoaXMuaW5kPQppY2F0b3Iuc2hvdyhtLGwsbil9fSxfaGlkZUxvYWRpbmdJbmRpY2F0
b3I6ZnVuY3Rpb24obCxtKXtsPTNEKGwhPTNEPTNEdW5kZWY9CmluZWQpPyhsKToodGhpcy5meFNw
ZWVkKTtpZih0aGlzLmluZGljYXRvcil7dGhpcy5pbmRpY2F0b3IuaGlkZShsLG0pfX0sZGlzcD0K
bGF5TWVzc2FnZTpmdW5jdGlvbihxLHIscCl7dmFyIG49M0R0aGlzO3RoaXMuc2Nyb2xsVG9Ub3Ao
KTt2YXIgbz0zRHRoaXMuJG1lPQpzc2FnZXMoKSxsPTNEJCgiPGRpdi8+IikuYWRkQ2xhc3MocSsi
bWVzc2FnZSIpLmh0bWwocik7aWYoIV8uaXNFbXB0eShwKSl7dmE9CnIgbT0zRCQoJzxhIGhyZWY9
M0QiamF2YXNjcmlwdDp2b2lkKDApIj5EZXRhaWxzPC9hPicpLmNsaWNrKGZ1bmN0aW9uKCl7R2Fs
YT0KeHkubW9kYWwuc2hvdyhuLl9tZXNzYWdlVG9Nb2RhbE9wdGlvbnMocSxyLHApKTtyZXR1cm4g
ZmFsc2V9KTtsLmFwcGVuZCgiICIsPQptKX1yZXR1cm4gby5odG1sKGwpfSxfbWVzc2FnZVRvTW9k
YWxPcHRpb25zOmZ1bmN0aW9uKHAscixvKXt2YXIgbD0zRHRoaXMscT0KPTNEJCgiPGRpdi8+Iiks
bj0zRHt0aXRsZToiRGV0YWlscyJ9O2Z1bmN0aW9uIG0ocyl7cz0zRF8ub21pdChzLF8uZnVuY3Rp
b25zPQoocykpO3JldHVyblsiPHRhYmxlPiIsXy5tYXAocyxmdW5jdGlvbih1LHQpe3U9M0QoXy5p
c09iamVjdCh1KSk/KG0odSkpOih1KTs9CnJldHVybic8dHI+PHRkIHN0eWxlPTNEInZlcnRpY2Fs
LWFsaWduOiB0b3A7IGNvbG9yOiBncmV5Ij4nK3QrJzwvdGQ+PHRkIHN0eT0KbGU9M0QicGFkZGlu
Zy1sZWZ0OiA4cHgiPicrdSsiPC90ZD48L3RyPiJ9KS5qb2luKCIiKSwiPC90YWJsZT4iXS5qb2lu
KCIiKX1pPQpmKF8uaXNPYmplY3Qobykpe24uYm9keT0zRHEuYXBwZW5kKG0obykpfWVsc2V7bi5i
b2R5PTNEcS5odG1sKG8pfW4uYnV0dG9ucz0KPTNEe09rOmZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFs
LmhpZGUoKTtsLmNsZWFyTWVzc2FnZXMoKX19O3JldHVybiBufSxjbGVhck1lPQpzc2FnZXM6ZnVu
Y3Rpb24oKXt0aGlzLiRtZXNzYWdlcygpLmVtcHR5KCk7cmV0dXJuIHRoaXN9LHNjcm9sbFBvc2l0
aW9uOmZ1bmM9CnRpb24oKXtyZXR1cm4gdGhpcy4kY29udGFpbmVyKCkuc2Nyb2xsVG9wKCl9LHNj
cm9sbFRvOmZ1bmN0aW9uKGwpe3RoaXMuJGNvbj0KdGFpbmVyKCkuc2Nyb2xsVG9wKGwpO3JldHVy
biB0aGlzfSxzY3JvbGxUb1RvcDpmdW5jdGlvbigpe3RoaXMuJGNvbnRhaW5lcigpPQouc2Nyb2xs
VG9wKDApO3JldHVybiB0aGlzfSxzY3JvbGxUb0lkOmZ1bmN0aW9uKG0pe2lmKCghbSl8fCghdGhp
cy5oZGFWaWV3c1s9Cm1dKSl7cmV0dXJuIHRoaXN9dmFyIGw9M0R0aGlzLmhkYVZpZXdzW21dO3Ro
aXMuc2Nyb2xsVG8obC5lbC5vZmZzZXRUb3ApO3JldD0KdXJuIHRoaXN9LHNjcm9sbFRvSGlkOmZ1
bmN0aW9uKGwpe3ZhciBtPTNEdGhpcy5tb2RlbC5oZGFzLmdldEJ5SGlkKGwpO2lmKCFtPQope3Jl
dHVybiB0aGlzfXJldHVybiB0aGlzLnNjcm9sbFRvSWQobS5pZCl9LHRvU3RyaW5nOmZ1bmN0aW9u
KCl7cmV0dXJuIlJlYWQ9Ck9ubHlIaXN0b3J5UGFuZWwoIisoKHRoaXMubW9kZWwpPyh0aGlzLm1v
ZGVsLmdldCgibmFtZSIpKTooIiIpKSsiKSJ9fSk7dmFyID0Kaz0zRFsnPGRpdiBjbGFzcz0zRCJo
aXN0b3J5LWNvbnRyb2xzIj4nLCc8ZGl2IGNsYXNzPTNEImhpc3Rvcnktc2VhcmNoLWNvbnRyPQpv
bHMiPicsJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS1zZWFyY2gtaW5wdXQiPjwvZGl2PicsIjwvZGl2
PiIsJzxkaXYgY2xhc3M9M0Q9CiJoaXN0b3J5LXRpdGxlIj4nLCI8JSBpZiggaGlzdG9yeS5uYW1l
ICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJoaXN0b3J5LW5hbWUiPj0KPCU9M0QgaGlzdG9yeS5uYW1l
ICU+PC9kaXY+JywiPCUgfSAlPiIsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS1zdWJ0
PQppdGxlIGNsZWFyIj4nLCI8JSBpZiggaGlzdG9yeS5uaWNlX3NpemUgKXsgJT4iLCc8ZGl2IGNs
YXNzPTNEImhpc3Rvcnktc2l6ZSI9Cj48JT0zRCBoaXN0b3J5Lm5pY2Vfc2l6ZSAlPjwvZGl2Pics
IjwlIH0gJT4iLCc8ZGl2IGNsYXNzPTNEImhpc3Rvcnktc2Vjb25kYT0KcnktYWN0aW9ucyI+PC9k
aXY+JywiPC9kaXY+IiwiPCUgaWYoIGhpc3RvcnkuZGVsZXRlZCApeyAlPiIsJzxkaXYgY2xhc3M9
M0QiPQp3YXJuaW5nbWVzc2FnZXNtYWxsIj48c3Ryb25nPicsZCgiWW91IGFyZSBjdXJyZW50bHkg
dmlld2luZyBhIGRlbGV0ZWQgaGlzdG89CnJ5ISIpLCI8L3N0cm9uZz48L2Rpdj4iLCI8JSB9ICU+
IiwnPGRpdiBjbGFzcz0zRCJtZXNzYWdlLWNvbnRhaW5lciI+JywiPCUgaT0KZiggaGlzdG9yeS5t
ZXNzYWdlICl7ICU+IiwnPGRpdiBjbGFzcz0zRCI8JT0zRCBoaXN0b3J5LnN0YXR1cyAlPm1lc3Nh
Z2UiPjwlPQo9M0QgaGlzdG9yeS5tZXNzYWdlICU+PC9kaXY+JywiPCUgfSAlPiIsIjwvZGl2PiIs
JzxkaXYgY2xhc3M9M0QicXVvdGEtbWVzc2E9CmdlIGVycm9ybWVzc2FnZSI+JyxkKCJZb3UgYXJl
IG92ZXIgeW91ciBkaXNrIHF1b3RhLiIpLGQoIlRvb2wgZXhlY3V0aW9uIGlzID0Kb24gaG9sZCB1
bnRpbCB5b3VyIGRpc2sgdXNhZ2UgZHJvcHMgYmVsb3cgeW91ciBhbGxvY2F0ZWQgcXVvdGEuIiks
IjwvZGl2PiIsPQonPGRpdiBjbGFzcz0zRCJ0YWdzLWRpc3BsYXkiPjwvZGl2PicsJzxkaXYgY2xh
c3M9M0QiYW5ub3RhdGlvbi1kaXNwbGF5Ij48L2Q9Cml2PicsJzxkaXYgY2xhc3M9M0QiaGlzdG9y
eS1kYXRhc2V0LWFjdGlvbnMiPicsJzxkaXYgY2xhc3M9M0QiYnRuLWdyb3VwIj4nLD0KJzxidXR0
b24gY2xhc3M9M0QiaGlzdG9yeS1zZWxlY3QtYWxsLWRhdGFzZXRzLWJ0biBidG4gYnRuLWRlZmF1
bHQiJywnZGF0YS1tPQpvZGU9M0Qic2VsZWN0Ij4nLGQoIkFsbCIpLCI8L2J1dHRvbj4iLCc8YnV0
dG9uIGNsYXNzPTNEImhpc3RvcnktZGVzZWxlY3QtYWw9CmwtZGF0YXNldHMtYnRuIGJ0biBidG4t
ZGVmYXVsdCInLCdkYXRhLW1vZGU9M0Qic2VsZWN0Ij4nLGQoIk5vbmUiKSwiPC9idXR0bz0Kbj4i
LCI8L2Rpdj4iLCc8YnV0dG9uIGNsYXNzPTNEImhpc3RvcnktZGF0YXNldC1hY3Rpb24tcG9wdXAt
YnRuIGJ0biBidG4tZGVmPQphdWx0Ij4nLGQoIkZvciBhbGwgc2VsZWN0ZWQiKSwiLi4uPC9idXR0
b24+IiwiPC9kaXY+IiwiPC9kaXY+IiwnPGRpdiBjbGFzcz0KPTNEImRhdGFzZXRzLWxpc3QiPjwv
ZGl2PicsJzxkaXYgY2xhc3M9M0QiZW1wdHktaGlzdG9yeS1tZXNzYWdlIGluZm9tZXNzYWdlPQpz
bWFsbCI+JyxkKCJZb3VyIGhpc3RvcnkgaXMgZW1wdHkuIENsaWNrICdHZXQgRGF0YScgb24gdGhl
IGxlZnQgcGFuZSB0byBzdGE9CnJ0IiksIjwvZGl2PiJdLmpvaW4oIiIpO2oudGVtcGxhdGVzPTNE
e2hpc3RvcnlQYW5lbDpmdW5jdGlvbihsKXtyZXR1cm4gXy50ZT0KbXBsYXRlKGssbCx7dmFyaWFi
bGU6Imhpc3RvcnkifSl9fTtyZXR1cm57UmVhZE9ubHlIaXN0b3J5UGFuZWw6an19KTsKXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpUaGlzIGRpZmYgaXMgc28gYmlnIHRoYXQgd2UgbmVlZGVk
IHRvIHRydW5jYXRlIHRoZSByZW1haW5kZXIuCgpSZXBvc2l0b3J5IFVSTDogaHR0cHM6Ly9iaXRi
dWNrZXQub3JnL2dhbGF4eS9nYWxheHktY2VudHJhbC8KCi0tCgpUaGlzIGlzIGEgY29tbWl0IG5v
dGlmaWNhdGlvbiBmcm9tIGJpdGJ1Y2tldC5vcmcuIFlvdSBhcmUgcmVjZWl2aW5nCnRoaXMgYmVj
YXVzZSB5b3UgaGF2ZSB0aGUgc2VydmljZSBlbmFibGVkLCBhZGRyZXNzaW5nIHRoZSByZWNpcGll
bnQgb2YKdGhpcyBlbWFpbC4K
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c2a0ca50e640/
Changeset: c2a0ca50e640
User: dan
Date: 2014-04-15 17:59:14
Summary: UI, make HDAs in NEW state have delete, info and rerun buttons, as well as disabled view and edit buttons. Move new state to NOT READY STATES.
Affected #: 3 files
diff -r 3b3365a391944f848b403412f226ee9e5499c0d5 -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -165,7 +165,6 @@
// (do show if in error, running)
if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.DISCARDED )
- || ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW )
|| ( !this.model.get( 'accessible' ) ) ){
return null;
}
@@ -185,6 +184,11 @@
displayBtnData.disabled = true;
displayBtnData.title = _l( 'This dataset must finish uploading before it can be viewed' );
+ // disable if still new
+ } else if( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW ){
+ displayBtnData.disabled = true;
+ displayBtnData.title = _l( 'This dataset is not yet viewable' );
+
} else {
displayBtnData.title = _l( 'View data' );
@@ -312,7 +316,8 @@
*/
_render_body_new : function(){
return this._render_stateBodyHelper(
- '<div>' + _l( 'This is a new dataset and not all of its data are available yet' ) + '</div>'
+ '<div>' + _l( 'This is a new dataset and not all of its data are available yet' ) + '</div>',
+ this.defaultPrimaryActionButtonRenderers
);
},
/** Render inaccessible, not-owned by curr user. */
diff -r 3b3365a391944f848b403412f226ee9e5499c0d5 -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a static/scripts/mvc/dataset/hda-edit.js
--- a/static/scripts/mvc/dataset/hda-edit.js
+++ b/static/scripts/mvc/dataset/hda-edit.js
@@ -64,8 +64,7 @@
_render_editButton : function(){
// don't show edit while uploading, in-accessible
// DO show if in error (ala previous history panel)
- if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW )
- || ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.DISCARDED )
+ if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.DISCARDED )
|| ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( !this.model.get( 'accessible' ) ) ){
return null;
@@ -93,6 +92,11 @@
} else if( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.UPLOAD ){
editBtnData.disabled = true;
editBtnData.title = _l( 'This dataset must finish uploading before it can be edited' );
+
+ // disable if new
+ } else if( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW ){
+ editBtnData.disabled = true;
+ editBtnData.title = _l( 'This dataset is not yet editable' );
}
editBtnData.faIcon = 'fa-pencil';
return faIconButton( editBtnData );
@@ -103,8 +107,7 @@
*/
_render_deleteButton : function(){
// don't show delete if...
- if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW )
- || ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
+ if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( !this.model.get( 'accessible' ) ) ){
return null;
}
diff -r 3b3365a391944f848b403412f226ee9e5499c0d5 -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a static/scripts/mvc/dataset/hda-model.js
--- a/static/scripts/mvc/dataset/hda-model.js
+++ b/static/scripts/mvc/dataset/hda-model.js
@@ -377,7 +377,6 @@
/** states that are in a final state (the underlying job is complete) */
HistoryDatasetAssociation.READY_STATES = [
- HistoryDatasetAssociation.STATES.NEW,
HistoryDatasetAssociation.STATES.OK,
HistoryDatasetAssociation.STATES.EMPTY,
HistoryDatasetAssociation.STATES.PAUSED,
@@ -392,7 +391,8 @@
HistoryDatasetAssociation.STATES.UPLOAD,
HistoryDatasetAssociation.STATES.QUEUED,
HistoryDatasetAssociation.STATES.RUNNING,
- HistoryDatasetAssociation.STATES.SETTING_METADATA
+ HistoryDatasetAssociation.STATES.SETTING_METADATA,
+ HistoryDatasetAssociation.STATES.NEW
];
//==============================================================================
https://bitbucket.org/galaxy/galaxy-central/commits/8346ec4baa39/
Changeset: 8346ec4baa39
User: dan
Date: 2014-04-15 18:00:02
Summary: Update packed scripts
Affected #: 3 files
diff -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a -r 8346ec4baa3992f4dc0161f0fc79a0ba893c0a63 static/scripts/packed/mvc/dataset/hda-base.js
--- a/static/scripts/packed/mvc/dataset/hda-base.js
+++ b/static/scripts/packed/mvc/dataset/hda-base.js
@@ -1,1 +1,1 @@
-define(["mvc/dataset/hda-model","mvc/base-mvc"],function(d,b){var c=Backbone.View.extend(b.LoggableMixin).extend({tagName:"div",className:"dataset hda history-panel-hda",id:function(){return"hda-"+this.model.get("id")},fxSpeed:"fast",initialize:function(f){if(f.logger){this.logger=this.model.logger=f.logger}this.log(this+".initialize:",f);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];this.linkTarget=f.linkTarget||"_blank";this.selectable=f.selectable||false;this.selected=f.selected||false;this.expanded=f.expanded||false;this.draggable=f.draggable||false;this._setUpListeners()},_setUpListeners:function(){this.model.on("change",function(g,f){if(this.model.changedAttributes().state&&this.model.inReadyState()&&this.expanded&&!this.model.hasDetails()){this.model.fetch()}else{this.render()}},this)},render:function(h){h=(h===undefined)?(true):(h);var f=this;this.$el.find("[title]").tooltip("destroy");this.urls=this.model.urls();var g=this._buildNewRender();if(h){$(f).queue(function(i){this.$el.fadeOut(f.fxSpeed,i)})}$(f).queue(function(i){this.$el.empty().attr("class",f.className).addClass("state-"+f.model.get("state")).append(g.children());if(this.selectable){this.showSelector(0)}i()});if(h){$(f).queue(function(i){this.$el.fadeIn(f.fxSpeed,i)})}$(f).queue(function(i){this.trigger("rendered",f);if(this.model.inReadyState()){this.trigger("rendered:ready",f)}if(this.draggable){this.draggableOn()}i()});return this},_buildNewRender:function(){var f=$(c.templates.skeleton(this.model.toJSON()));f.find(".dataset-primary-actions").append(this._render_titleButtons());f.children(".dataset-body").replaceWith(this._render_body());this._setUpBehaviors(f);return f},_setUpBehaviors:function(f){f=f||this.$el;make_popup_menus(f);f.find("[title]").tooltip({placement:"bottom"})},_render_titleButtons:function(){return[this._render_displayButton()]},_render_displayButton:function(){if((this.model.get("state")===d.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(this.model.get("state")===d.HistoryDatasetAssociation.STATES.DISCARDED)||(this.model.get("state")===d.HistoryDatasetAssociation.STATES.NEW)||(!this.model.get("accessible"))){return null}var g={target:this.linkTarget,classes:"dataset-display"};if(this.model.get("purged")){g.disabled=true;g.title=_l("Cannot display datasets removed from disk")}else{if(this.model.get("state")===d.HistoryDatasetAssociation.STATES.UPLOAD){g.disabled=true;g.title=_l("This dataset must finish uploading before it can be viewed")}else{g.title=_l("View data");g.href=this.urls.display;var f=this;g.onclick=function(h){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Data Viewer: "+f.model.get("name"),type:"url",content:f.urls.display});h.preventDefault()}}}}g.faIcon="fa-eye";return faIconButton(g)},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var g=this.urls,h=this.model.get("meta_files");if(_.isEmpty(h)){return $(['<a href="'+g.download+'" title="'+_l("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>',"</a>"].join(""))}var i="dataset-"+this.model.get("id")+"-popup",f=['<div popupmenu="'+i+'">','<a href="'+g.download+'">',_l("Download Dataset"),"</a>","<a>"+_l("Additional Files")+"</a>",_.map(h,function(j){return['<a class="action-button" href="',g.meta_download+j.file_type,'">',_l("Download")," ",j.file_type,"</a>"].join("")}).join("\n"),"</div>",'<div class="icon-btn-group">','<a href="'+g.download+'" title="'+_l("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>','</a><a class="icon-btn popup" id="'+i+'">','<span class="fa fa-caret-down"></span>',"</a>","</div>"].join("\n");return $(f)},_render_showParamsButton:function(){return faIconButton({title:_l("View details"),classes:"dataset-params-btn",href:this.urls.show_params,target:this.linkTarget,faIcon:"fa-info-circle"})},_render_body:function(){var g=$('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'),f=this["_render_body_"+this.model.get("state")];if(_.isFunction(f)){g=f.call(this)}this._setUpBehaviors(g);if(this.expanded){g.show()}return g},_render_stateBodyHelper:function(f,i){i=i||[];var g=this,h=$(c.templates.body(_.extend(this.model.toJSON(),{body:f})));h.find(".dataset-actions .left").append(_.map(i,function(j){return j.call(g)}));return h},_render_body_new:function(){return this._render_stateBodyHelper("<div>"+_l("This is a new dataset and not all of its data are available yet")+"</div>")},_render_body_noPermission:function(){return this._render_stateBodyHelper("<div>"+_l("You do not have permission to view this dataset")+"</div>")},_render_body_discarded:function(){return this._render_stateBodyHelper("<div>"+_l("The job creating this dataset was cancelled before completion")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_queued:function(){return this._render_stateBodyHelper("<div>"+_l("This job is waiting to run")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_upload:function(){return this._render_stateBodyHelper("<div>"+_l("This dataset is currently uploading")+"</div>")},_render_body_setting_metadata:function(){return this._render_stateBodyHelper("<div>"+_l("Metadata is being auto-detected")+"</div>")},_render_body_running:function(){return this._render_stateBodyHelper("<div>"+_l("This job is currently running")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_paused:function(){return this._render_stateBodyHelper("<div>"+_l('This job is paused. Use the "Resume Paused Jobs" in the history menu to resume')+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_error:function(){var f=['<span class="help-text">',_l("An error occurred with this dataset"),":</span>",'<div class="job-error-text">',$.trim(this.model.get("misc_info")),"</div>"].join("");if(!this.model.get("purged")){f="<div>"+this.model.get("misc_blurb")+"</div>"+f}return this._render_stateBodyHelper(f,[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers))},_render_body_empty:function(){return this._render_stateBodyHelper("<div>"+_l("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>",this.defaultPrimaryActionButtonRenderers)},_render_body_failed_metadata:function(){var f=$('<div class="warningmessagesmall"></div>').append($("<strong/>").text(_l("An error occurred setting the metadata for this dataset"))),g=this._render_body_ok();g.prepend(f);return g},_render_body_ok:function(){var f=this,h=$(c.templates.body(this.model.toJSON())),g=[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers);h.find(".dataset-actions .left").append(_.map(g,function(i){return i.call(f)}));if(this.model.isDeletedOrPurged()){return h}return h},events:{"click .dataset-title-bar":"toggleBodyVisibility","keydown .dataset-title-bar":"toggleBodyVisibility","click .dataset-selector":"toggleSelect"},toggleBodyVisibility:function(i,g){var f=32,h=13;if(i&&(i.type==="keydown")&&!(i.keyCode===f||i.keyCode===h)){return true}var j=this.$el.find(".dataset-body");g=(g===undefined)?(!j.is(":visible")):(g);if(g){this.expandBody()}else{this.collapseBody()}return false},expandBody:function(){var f=this;function g(){f.$el.children(".dataset-body").replaceWith(f._render_body());f.$el.children(".dataset-body").slideDown(f.fxSpeed,function(){f.expanded=true;f.trigger("body-expanded",f.model.get("id"))})}if(this.model.inReadyState()&&!this.model.hasDetails()){this.model.fetch({silent:true}).always(function(h){f.urls=f.model.urls();g()})}else{g()}},collapseBody:function(){var f=this;this.$el.children(".dataset-body").slideUp(f.fxSpeed,function(){f.expanded=false;f.trigger("body-collapsed",f.model.get("id"))})},showSelector:function(){if(this.selected){this.select(null,true)}this.selectable=true;this.trigger("selectable",true,this);this.$(".dataset-primary-actions").hide();this.$(".dataset-selector").show()},hideSelector:function(){this.selectable=false;this.trigger("selectable",false,this);this.$(".dataset-selector").hide();this.$(".dataset-primary-actions").show()},toggleSelector:function(){if(!this.$el.find(".dataset-selector").is(":visible")){this.showSelector()}else{this.hideSelector()}},select:function(f){this.$el.find(".dataset-selector span").removeClass("fa-square-o").addClass("fa-check-square-o");if(!this.selected){this.trigger("selected",this);this.selected=true}return false},deselect:function(f){this.$el.find(".dataset-selector span").removeClass("fa-check-square-o").addClass("fa-square-o");if(this.selected){this.trigger("de-selected",this);this.selected=false}return false},toggleSelect:function(f){if(this.selected){this.deselect(f)}else{this.select(f)}},draggableOn:function(){this.draggable=true;this.dragStartHandler=_.bind(this._dragStartHandler,this);this.dragEndHandler=_.bind(this._dragEndHandler,this);var f=this.$el.find(".dataset-title-bar").attr("draggable",true).get(0);f.addEventListener("dragstart",this.dragStartHandler,false);f.addEventListener("dragend",this.dragEndHandler,false)},draggableOff:function(){this.draggable=false;var f=this.$el.find(".dataset-title-bar").attr("draggable",false).get(0);f.removeEventListener("dragstart",this.dragStartHandler,false);f.removeEventListener("dragend",this.dragEndHandler,false)},toggleDraggable:function(){if(this.draggable){this.draggableOff()}else{this.draggableOn()}},_dragStartHandler:function(f){this.trigger("dragstart",this);f.dataTransfer.effectAllowed="move";f.dataTransfer.setData("text",JSON.stringify(this.model.toJSON()));return false},_dragEndHandler:function(f){this.trigger("dragend",this);return false},remove:function(g){var f=this;this.$el.fadeOut(f.fxSpeed,function(){f.$el.remove();f.off();if(g){g()}})},toString:function(){var f=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+f+")"}});var a=['<div class="dataset hda">','<div class="dataset-warnings">',"<% if( hda.error ){ %>",'<div class="errormessagesmall">',_l("There was an error getting the data for this dataset"),":<%- hda.error %>","</div>","<% } %>","<% if( hda.deleted ){ %>","<% if( hda.purged ){ %>",'<div class="dataset-purged-msg warningmessagesmall"><strong>',_l("This dataset has been deleted and removed from disk."),"</strong></div>","<% } else { %>",'<div class="dataset-deleted-msg warningmessagesmall"><strong>',_l("This dataset has been deleted."),"</strong></div>","<% } %>","<% } %>","<% if( !hda.visible ){ %>",'<div class="dataset-hidden-msg warningmessagesmall"><strong>',_l("This dataset has been hidden."),"</strong></div>","<% } %>","</div>",'<div class="dataset-selector">','<span class="fa fa-2x fa-square-o"></span>',"</div>",'<div class="dataset-primary-actions"></div>','<div class="dataset-title-bar clear" tabindex="0">','<span class="dataset-state-icon state-icon"></span>','<div class="dataset-title">','<span class="hda-hid"><%- hda.hid %></span> ','<span class="dataset-name"><%- hda.name %></span>',"</div>","</div>",'<div class="dataset-body"></div>',"</div>"].join("");var e=['<div class="dataset-body">',"<% if( hda.body ){ %>",'<div class="dataset-summary">',"<%= hda.body %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% } else { %>",'<div class="dataset-summary">',"<% if( hda.misc_blurb ){ %>",'<div class="dataset-blurb">','<span class="value"><%- hda.misc_blurb %></span>',"</div>","<% } %>","<% if( hda.data_type ){ %>",'<div class="dataset-datatype">','<label class="prompt">',_l("format"),"</label>",'<span class="value"><%- hda.data_type %></span>',"</div>","<% } %>","<% if( hda.metadata_dbkey ){ %>",'<div class="dataset-dbkey">','<label class="prompt">',_l("database"),"</label>",'<span class="value">',"<%- hda.metadata_dbkey %>","</span>","</div>","<% } %>","<% if( hda.misc_info ){ %>",'<div class="dataset-info">','<span class="value"><%- hda.misc_info %></span>',"</div>","<% } %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% if( !hda.deleted ){ %>",'<div class="tags-display"></div>','<div class="annotation-display"></div>','<div class="dataset-display-applications">',"<% _.each( hda.display_apps, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","<% _.each( hda.display_types, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","</div>",'<div class="dataset-peek">',"<% if( hda.peek ){ %>",'<pre class="peek"><%= hda.peek %></pre>',"<% } %>","</div>","<% } %>","<% } %>","</div>"].join("");c.templates={skeleton:function(f){return _.template(a,f,{variable:"hda"})},body:function(f){return _.template(e,f,{variable:"hda"})}};return{HDABaseView:c}});
\ No newline at end of file
+define(["mvc/dataset/hda-model","mvc/base-mvc"],function(d,b){var c=Backbone.View.extend(b.LoggableMixin).extend({tagName:"div",className:"dataset hda history-panel-hda",id:function(){return"hda-"+this.model.get("id")},fxSpeed:"fast",initialize:function(f){if(f.logger){this.logger=this.model.logger=f.logger}this.log(this+".initialize:",f);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];this.linkTarget=f.linkTarget||"_blank";this.selectable=f.selectable||false;this.selected=f.selected||false;this.expanded=f.expanded||false;this.draggable=f.draggable||false;this._setUpListeners()},_setUpListeners:function(){this.model.on("change",function(g,f){if(this.model.changedAttributes().state&&this.model.inReadyState()&&this.expanded&&!this.model.hasDetails()){this.model.fetch()}else{this.render()}},this)},render:function(h){h=(h===undefined)?(true):(h);var f=this;this.$el.find("[title]").tooltip("destroy");this.urls=this.model.urls();var g=this._buildNewRender();if(h){$(f).queue(function(i){this.$el.fadeOut(f.fxSpeed,i)})}$(f).queue(function(i){this.$el.empty().attr("class",f.className).addClass("state-"+f.model.get("state")).append(g.children());if(this.selectable){this.showSelector(0)}i()});if(h){$(f).queue(function(i){this.$el.fadeIn(f.fxSpeed,i)})}$(f).queue(function(i){this.trigger("rendered",f);if(this.model.inReadyState()){this.trigger("rendered:ready",f)}if(this.draggable){this.draggableOn()}i()});return this},_buildNewRender:function(){var f=$(c.templates.skeleton(this.model.toJSON()));f.find(".dataset-primary-actions").append(this._render_titleButtons());f.children(".dataset-body").replaceWith(this._render_body());this._setUpBehaviors(f);return f},_setUpBehaviors:function(f){f=f||this.$el;make_popup_menus(f);f.find("[title]").tooltip({placement:"bottom"})},_render_titleButtons:function(){return[this._render_displayButton()]},_render_displayButton:function(){if((this.model.get("state")===d.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(this.model.get("state")===d.HistoryDatasetAssociation.STATES.DISCARDED)||(!this.model.get("accessible"))){return null}var g={target:this.linkTarget,classes:"dataset-display"};if(this.model.get("purged")){g.disabled=true;g.title=_l("Cannot display datasets removed from disk")}else{if(this.model.get("state")===d.HistoryDatasetAssociation.STATES.UPLOAD){g.disabled=true;g.title=_l("This dataset must finish uploading before it can be viewed")}else{if(this.model.get("state")===d.HistoryDatasetAssociation.STATES.NEW){g.disabled=true;g.title=_l("This dataset is not yet viewable")}else{g.title=_l("View data");g.href=this.urls.display;var f=this;g.onclick=function(h){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Data Viewer: "+f.model.get("name"),type:"url",content:f.urls.display});h.preventDefault()}}}}}g.faIcon="fa-eye";return faIconButton(g)},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var g=this.urls,h=this.model.get("meta_files");if(_.isEmpty(h)){return $(['<a href="'+g.download+'" title="'+_l("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>',"</a>"].join(""))}var i="dataset-"+this.model.get("id")+"-popup",f=['<div popupmenu="'+i+'">','<a href="'+g.download+'">',_l("Download Dataset"),"</a>","<a>"+_l("Additional Files")+"</a>",_.map(h,function(j){return['<a class="action-button" href="',g.meta_download+j.file_type,'">',_l("Download")," ",j.file_type,"</a>"].join("")}).join("\n"),"</div>",'<div class="icon-btn-group">','<a href="'+g.download+'" title="'+_l("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>','</a><a class="icon-btn popup" id="'+i+'">','<span class="fa fa-caret-down"></span>',"</a>","</div>"].join("\n");return $(f)},_render_showParamsButton:function(){return faIconButton({title:_l("View details"),classes:"dataset-params-btn",href:this.urls.show_params,target:this.linkTarget,faIcon:"fa-info-circle"})},_render_body:function(){var g=$('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'),f=this["_render_body_"+this.model.get("state")];if(_.isFunction(f)){g=f.call(this)}this._setUpBehaviors(g);if(this.expanded){g.show()}return g},_render_stateBodyHelper:function(f,i){i=i||[];var g=this,h=$(c.templates.body(_.extend(this.model.toJSON(),{body:f})));h.find(".dataset-actions .left").append(_.map(i,function(j){return j.call(g)}));return h},_render_body_new:function(){return this._render_stateBodyHelper("<div>"+_l("This is a new dataset and not all of its data are available yet")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_noPermission:function(){return this._render_stateBodyHelper("<div>"+_l("You do not have permission to view this dataset")+"</div>")},_render_body_discarded:function(){return this._render_stateBodyHelper("<div>"+_l("The job creating this dataset was cancelled before completion")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_queued:function(){return this._render_stateBodyHelper("<div>"+_l("This job is waiting to run")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_upload:function(){return this._render_stateBodyHelper("<div>"+_l("This dataset is currently uploading")+"</div>")},_render_body_setting_metadata:function(){return this._render_stateBodyHelper("<div>"+_l("Metadata is being auto-detected")+"</div>")},_render_body_running:function(){return this._render_stateBodyHelper("<div>"+_l("This job is currently running")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_paused:function(){return this._render_stateBodyHelper("<div>"+_l('This job is paused. Use the "Resume Paused Jobs" in the history menu to resume')+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_error:function(){var f=['<span class="help-text">',_l("An error occurred with this dataset"),":</span>",'<div class="job-error-text">',$.trim(this.model.get("misc_info")),"</div>"].join("");if(!this.model.get("purged")){f="<div>"+this.model.get("misc_blurb")+"</div>"+f}return this._render_stateBodyHelper(f,[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers))},_render_body_empty:function(){return this._render_stateBodyHelper("<div>"+_l("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>",this.defaultPrimaryActionButtonRenderers)},_render_body_failed_metadata:function(){var f=$('<div class="warningmessagesmall"></div>').append($("<strong/>").text(_l("An error occurred setting the metadata for this dataset"))),g=this._render_body_ok();g.prepend(f);return g},_render_body_ok:function(){var f=this,h=$(c.templates.body(this.model.toJSON())),g=[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers);h.find(".dataset-actions .left").append(_.map(g,function(i){return i.call(f)}));if(this.model.isDeletedOrPurged()){return h}return h},events:{"click .dataset-title-bar":"toggleBodyVisibility","keydown .dataset-title-bar":"toggleBodyVisibility","click .dataset-selector":"toggleSelect"},toggleBodyVisibility:function(i,g){var f=32,h=13;if(i&&(i.type==="keydown")&&!(i.keyCode===f||i.keyCode===h)){return true}var j=this.$el.find(".dataset-body");g=(g===undefined)?(!j.is(":visible")):(g);if(g){this.expandBody()}else{this.collapseBody()}return false},expandBody:function(){var f=this;function g(){f.$el.children(".dataset-body").replaceWith(f._render_body());f.$el.children(".dataset-body").slideDown(f.fxSpeed,function(){f.expanded=true;f.trigger("body-expanded",f.model.get("id"))})}if(this.model.inReadyState()&&!this.model.hasDetails()){this.model.fetch({silent:true}).always(function(h){f.urls=f.model.urls();g()})}else{g()}},collapseBody:function(){var f=this;this.$el.children(".dataset-body").slideUp(f.fxSpeed,function(){f.expanded=false;f.trigger("body-collapsed",f.model.get("id"))})},showSelector:function(){if(this.selected){this.select(null,true)}this.selectable=true;this.trigger("selectable",true,this);this.$(".dataset-primary-actions").hide();this.$(".dataset-selector").show()},hideSelector:function(){this.selectable=false;this.trigger("selectable",false,this);this.$(".dataset-selector").hide();this.$(".dataset-primary-actions").show()},toggleSelector:function(){if(!this.$el.find(".dataset-selector").is(":visible")){this.showSelector()}else{this.hideSelector()}},select:function(f){this.$el.find(".dataset-selector span").removeClass("fa-square-o").addClass("fa-check-square-o");if(!this.selected){this.trigger("selected",this);this.selected=true}return false},deselect:function(f){this.$el.find(".dataset-selector span").removeClass("fa-check-square-o").addClass("fa-square-o");if(this.selected){this.trigger("de-selected",this);this.selected=false}return false},toggleSelect:function(f){if(this.selected){this.deselect(f)}else{this.select(f)}},draggableOn:function(){this.draggable=true;this.dragStartHandler=_.bind(this._dragStartHandler,this);this.dragEndHandler=_.bind(this._dragEndHandler,this);var f=this.$el.find(".dataset-title-bar").attr("draggable",true).get(0);f.addEventListener("dragstart",this.dragStartHandler,false);f.addEventListener("dragend",this.dragEndHandler,false)},draggableOff:function(){this.draggable=false;var f=this.$el.find(".dataset-title-bar").attr("draggable",false).get(0);f.removeEventListener("dragstart",this.dragStartHandler,false);f.removeEventListener("dragend",this.dragEndHandler,false)},toggleDraggable:function(){if(this.draggable){this.draggableOff()}else{this.draggableOn()}},_dragStartHandler:function(f){this.trigger("dragstart",this);f.dataTransfer.effectAllowed="move";f.dataTransfer.setData("text",JSON.stringify(this.model.toJSON()));return false},_dragEndHandler:function(f){this.trigger("dragend",this);return false},remove:function(g){var f=this;this.$el.fadeOut(f.fxSpeed,function(){f.$el.remove();f.off();if(g){g()}})},toString:function(){var f=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+f+")"}});var a=['<div class="dataset hda">','<div class="dataset-warnings">',"<% if( hda.error ){ %>",'<div class="errormessagesmall">',_l("There was an error getting the data for this dataset"),":<%- hda.error %>","</div>","<% } %>","<% if( hda.deleted ){ %>","<% if( hda.purged ){ %>",'<div class="dataset-purged-msg warningmessagesmall"><strong>',_l("This dataset has been deleted and removed from disk."),"</strong></div>","<% } else { %>",'<div class="dataset-deleted-msg warningmessagesmall"><strong>',_l("This dataset has been deleted."),"</strong></div>","<% } %>","<% } %>","<% if( !hda.visible ){ %>",'<div class="dataset-hidden-msg warningmessagesmall"><strong>',_l("This dataset has been hidden."),"</strong></div>","<% } %>","</div>",'<div class="dataset-selector">','<span class="fa fa-2x fa-square-o"></span>',"</div>",'<div class="dataset-primary-actions"></div>','<div class="dataset-title-bar clear" tabindex="0">','<span class="dataset-state-icon state-icon"></span>','<div class="dataset-title">','<span class="hda-hid"><%- hda.hid %></span> ','<span class="dataset-name"><%- hda.name %></span>',"</div>","</div>",'<div class="dataset-body"></div>',"</div>"].join("");var e=['<div class="dataset-body">',"<% if( hda.body ){ %>",'<div class="dataset-summary">',"<%= hda.body %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% } else { %>",'<div class="dataset-summary">',"<% if( hda.misc_blurb ){ %>",'<div class="dataset-blurb">','<span class="value"><%- hda.misc_blurb %></span>',"</div>","<% } %>","<% if( hda.data_type ){ %>",'<div class="dataset-datatype">','<label class="prompt">',_l("format"),"</label>",'<span class="value"><%- hda.data_type %></span>',"</div>","<% } %>","<% if( hda.metadata_dbkey ){ %>",'<div class="dataset-dbkey">','<label class="prompt">',_l("database"),"</label>",'<span class="value">',"<%- hda.metadata_dbkey %>","</span>","</div>","<% } %>","<% if( hda.misc_info ){ %>",'<div class="dataset-info">','<span class="value"><%- hda.misc_info %></span>',"</div>","<% } %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% if( !hda.deleted ){ %>",'<div class="tags-display"></div>','<div class="annotation-display"></div>','<div class="dataset-display-applications">',"<% _.each( hda.display_apps, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","<% _.each( hda.display_types, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","</div>",'<div class="dataset-peek">',"<% if( hda.peek ){ %>",'<pre class="peek"><%= hda.peek %></pre>',"<% } %>","</div>","<% } %>","<% } %>","</div>"].join("");c.templates={skeleton:function(f){return _.template(a,f,{variable:"hda"})},body:function(f){return _.template(e,f,{variable:"hda"})}};return{HDABaseView:c}});
\ No newline at end of file
diff -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a -r 8346ec4baa3992f4dc0161f0fc79a0ba893c0a63 static/scripts/packed/mvc/dataset/hda-edit.js
--- a/static/scripts/packed/mvc/dataset/hda-edit.js
+++ b/static/scripts/packed/mvc/dataset/hda-edit.js
@@ -1,1 +1,1 @@
-define(["mvc/dataset/hda-model","mvc/dataset/hda-base","mvc/tags","mvc/annotations"],function(f,b,a,e){var g=b.HDABaseView.extend({initialize:function(h){b.HDABaseView.prototype.initialize.call(this,h);this.hasUser=h.hasUser;this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton,this._render_rerunButton];this.tagsEditorShown=h.tagsEditorShown||false;this.annotationEditorShown=h.annotationEditorShown||false},_render_titleButtons:function(){return b.HDABaseView.prototype._render_titleButtons.call(this).concat([this._render_editButton(),this._render_deleteButton()])},_render_editButton:function(){if((this.model.get("state")===f.HistoryDatasetAssociation.STATES.NEW)||(this.model.get("state")===f.HistoryDatasetAssociation.STATES.DISCARDED)||(this.model.get("state")===f.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var j=this.model.get("purged"),h=this.model.get("deleted"),i={title:_l("Edit attributes"),href:this.urls.edit,target:this.linkTarget,classes:"dataset-edit"};if(h||j){i.disabled=true;if(j){i.title=_l("Cannot edit attributes of datasets removed from disk")}else{if(h){i.title=_l("Undelete dataset to edit attributes")}}}else{if(this.model.get("state")===f.HistoryDatasetAssociation.STATES.UPLOAD){i.disabled=true;i.title=_l("This dataset must finish uploading before it can be edited")}}i.faIcon="fa-pencil";return faIconButton(i)},_render_deleteButton:function(){if((this.model.get("state")===f.HistoryDatasetAssociation.STATES.NEW)||(this.model.get("state")===f.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var h=this,i={title:_l("Delete"),classes:"dataset-delete",onclick:function(){h.$el.find(".icon-btn.dataset-delete").trigger("mouseout");h.model["delete"]()}};if(this.model.get("deleted")||this.model.get("purged")){i={title:_l("Dataset is already deleted"),disabled:true}}i.faIcon="fa-times";return faIconButton(i)},_render_errButton:function(){if(this.model.get("state")!==f.HistoryDatasetAssociation.STATES.ERROR){return null}return faIconButton({title:_l("View or report this error"),href:this.urls.report_error,classes:"dataset-report-error-btn",target:this.linkTarget,faIcon:"fa-bug"})},_render_rerunButton:function(){return faIconButton({title:_l("Run this job again"),href:this.urls.rerun,classes:"dataset-rerun-btn",target:this.linkTarget,faIcon:"fa-refresh"})},_render_visualizationsButton:function(){var h=this.model.get("visualizations");if((!this.hasUser)||(!this.model.hasData())||(_.isEmpty(h))){return null}if(_.isObject(h[0])){return this._render_visualizationsFrameworkButton(h)}if(!this.urls.visualization){return null}var j=this.model.get("dbkey"),n=this.urls.visualization,k={},o={dataset_id:this.model.get("id"),hda_ldda:"hda"};if(j){o.dbkey=j}var i=faIconButton({title:_l("Visualize"),classes:"dataset-visualize-btn",faIcon:"fa-bar-chart-o"});function l(p){if(p==="trackster"){return c(n,o,j)}return function(){Galaxy.frame.add({title:"Visualization",type:"url",content:n+"/"+p+"?"+$.param(o)})}}function m(p){return p.charAt(0).toUpperCase()+p.slice(1)}if(h.length===1){i.attr("data-original-title",_l("Visualize in ")+_l(m(h[0])));i.click(l(h[0]))}else{_.each(h,function(p){k[_l(m(p))]=l(p)});make_popupmenu(i,k)}return i},_render_visualizationsFrameworkButton:function(h){if(!(this.model.hasData())||!(h&&!_.isEmpty(h))){return null}var j=faIconButton({title:_l("Visualize"),classes:"dataset-visualize-btn",faIcon:"fa-bar-chart-o"});if(h.length===1){var i=h[0];j.attr("data-original-title",_l("Visualize in ")+i.html);j.attr("href",i.href)}else{var k=[];_.each(h,function(l){l.func=function(m){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Visualization",type:"url",content:l.href});m.preventDefault();return false}return true};k.push(l);return false});PopupMenu.create(j,k)}return j},_buildNewRender:function(){var h=b.HDABaseView.prototype._buildNewRender.call(this);h.find(".dataset-deleted-msg").append(_l(' Click <a href="javascript:void(0);" class="dataset-undelete">here</a> to undelete it or <a href="javascript:void(0);" class="dataset-purge">here</a> to immediately remove it from disk'));h.find(".dataset-hidden-msg").append(_l(' Click <a href="javascript:void(0);" class="dataset-unhide">here</a> to unhide it'));return h},_render_body_failed_metadata:function(){var i=$("<a/>").attr({href:this.urls.edit,target:this.linkTarget}).text(_l("set it manually or retry auto-detection")),h=$("<span/>").text(". "+_l("You may be able to")+" ").append(i),j=b.HDABaseView.prototype._render_body_failed_metadata.call(this);j.find(".warningmessagesmall strong").append(h);return j},_render_body_error:function(){var h=b.HDABaseView.prototype._render_body_error.call(this);h.find(".dataset-actions .left").prepend(this._render_errButton());return h},_render_body_ok:function(){var h=b.HDABaseView.prototype._render_body_ok.call(this);if(this.model.isDeletedOrPurged()){return h}this.makeDbkeyEditLink(h);if(this.hasUser){h.find(".dataset-actions .left").append(this._render_visualizationsButton());this._renderTags(h);this._renderAnnotation(h)}return h},_renderTags:function(h){var i=this;this.tagsEditor=new a.TagsEditor({model:this.model,el:h.find(".tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){i.tagsEditorShown=true},onhide:function(){i.tagsEditorShown=false},$activator:faIconButton({title:_l("Edit dataset tags"),classes:"dataset-tag-btn",faIcon:"fa-tags"}).appendTo(h.find(".dataset-actions .right"))});if(this.tagsEditorShown){this.tagsEditor.toggle(true)}},_renderAnnotation:function(h){var i=this;this.annotationEditor=new e.AnnotationEditor({model:this.model,el:h.find(".annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){i.annotationEditorShown=true},onhide:function(){i.annotationEditorShown=false},$activator:faIconButton({title:_l("Edit dataset annotation"),classes:"dataset-annotate-btn",faIcon:"fa-comment"}).appendTo(h.find(".dataset-actions .right"))});if(this.annotationEditorShown){this.annotationEditor.toggle(true)}},makeDbkeyEditLink:function(i){if(this.model.get("metadata_dbkey")==="?"&&!this.model.isDeletedOrPurged()){var h=$('<a class="value">?</a>').attr("href",this.urls.edit).attr("target",this.linkTarget);i.find(".dataset-dbkey .value").replaceWith(h)}},events:_.extend(_.clone(b.HDABaseView.prototype.events),{"click .dataset-undelete":function(h){this.model.undelete();return false},"click .dataset-unhide":function(h){this.model.unhide();return false},"click .dataset-purge":"confirmPurge"}),confirmPurge:function d(h){this.model.purge();return false},toString:function(){var h=(this.model)?(this.model+""):("(no model)");return"HDAView("+h+")"}});function c(h,j,i){return function(){var k={};if(i){k["f-dbkey"]=i}$.ajax({url:h+"/list_tracks?"+$.param(k),dataType:"html",error:function(){alert(("Could not add this dataset to browser")+".")},success:function(l){var m=window.parent;m.Galaxy.modal.show({title:"View Data in a New or Saved Visualization",buttons:{Cancel:function(){m.Galaxy.modal.hide()},"View in saved visualization":function(){m.Galaxy.modal.show({title:"Add Data to Saved Visualization",body:l,buttons:{Cancel:function(){m.Galaxy.modal.hide()},"Add to visualization":function(){$(m.document).find("input[name=id]:checked").each(function(){m.Galaxy.modal.hide();var n=$(this).val();j.id=n;m.Galaxy.frame.add({title:"Trackster",type:"url",content:h+"/trackster?"+$.param(j)})})}}})},"View in new visualization":function(){m.Galaxy.modal.hide();var n=h+"/trackster?"+$.param(j);m.Galaxy.frame.add({title:"Trackster",type:"url",content:n})}}})}});return false}}return{HDAEditView:g}});
\ No newline at end of file
+define(["mvc/dataset/hda-model","mvc/dataset/hda-base","mvc/tags","mvc/annotations"],function(f,b,a,e){var g=b.HDABaseView.extend({initialize:function(h){b.HDABaseView.prototype.initialize.call(this,h);this.hasUser=h.hasUser;this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton,this._render_rerunButton];this.tagsEditorShown=h.tagsEditorShown||false;this.annotationEditorShown=h.annotationEditorShown||false},_render_titleButtons:function(){return b.HDABaseView.prototype._render_titleButtons.call(this).concat([this._render_editButton(),this._render_deleteButton()])},_render_editButton:function(){if((this.model.get("state")===f.HistoryDatasetAssociation.STATES.DISCARDED)||(this.model.get("state")===f.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var j=this.model.get("purged"),h=this.model.get("deleted"),i={title:_l("Edit attributes"),href:this.urls.edit,target:this.linkTarget,classes:"dataset-edit"};if(h||j){i.disabled=true;if(j){i.title=_l("Cannot edit attributes of datasets removed from disk")}else{if(h){i.title=_l("Undelete dataset to edit attributes")}}}else{if(this.model.get("state")===f.HistoryDatasetAssociation.STATES.UPLOAD){i.disabled=true;i.title=_l("This dataset must finish uploading before it can be edited")}else{if(this.model.get("state")===f.HistoryDatasetAssociation.STATES.NEW){i.disabled=true;i.title=_l("This dataset is not yet editable")}}}i.faIcon="fa-pencil";return faIconButton(i)},_render_deleteButton:function(){if((this.model.get("state")===f.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var h=this,i={title:_l("Delete"),classes:"dataset-delete",onclick:function(){h.$el.find(".icon-btn.dataset-delete").trigger("mouseout");h.model["delete"]()}};if(this.model.get("deleted")||this.model.get("purged")){i={title:_l("Dataset is already deleted"),disabled:true}}i.faIcon="fa-times";return faIconButton(i)},_render_errButton:function(){if(this.model.get("state")!==f.HistoryDatasetAssociation.STATES.ERROR){return null}return faIconButton({title:_l("View or report this error"),href:this.urls.report_error,classes:"dataset-report-error-btn",target:this.linkTarget,faIcon:"fa-bug"})},_render_rerunButton:function(){return faIconButton({title:_l("Run this job again"),href:this.urls.rerun,classes:"dataset-rerun-btn",target:this.linkTarget,faIcon:"fa-refresh"})},_render_visualizationsButton:function(){var h=this.model.get("visualizations");if((!this.hasUser)||(!this.model.hasData())||(_.isEmpty(h))){return null}if(_.isObject(h[0])){return this._render_visualizationsFrameworkButton(h)}if(!this.urls.visualization){return null}var j=this.model.get("dbkey"),n=this.urls.visualization,k={},o={dataset_id:this.model.get("id"),hda_ldda:"hda"};if(j){o.dbkey=j}var i=faIconButton({title:_l("Visualize"),classes:"dataset-visualize-btn",faIcon:"fa-bar-chart-o"});function l(p){if(p==="trackster"){return c(n,o,j)}return function(){Galaxy.frame.add({title:"Visualization",type:"url",content:n+"/"+p+"?"+$.param(o)})}}function m(p){return p.charAt(0).toUpperCase()+p.slice(1)}if(h.length===1){i.attr("data-original-title",_l("Visualize in ")+_l(m(h[0])));i.click(l(h[0]))}else{_.each(h,function(p){k[_l(m(p))]=l(p)});make_popupmenu(i,k)}return i},_render_visualizationsFrameworkButton:function(h){if(!(this.model.hasData())||!(h&&!_.isEmpty(h))){return null}var j=faIconButton({title:_l("Visualize"),classes:"dataset-visualize-btn",faIcon:"fa-bar-chart-o"});if(h.length===1){var i=h[0];j.attr("data-original-title",_l("Visualize in ")+i.html);j.attr("href",i.href)}else{var k=[];_.each(h,function(l){l.func=function(m){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Visualization",type:"url",content:l.href});m.preventDefault();return false}return true};k.push(l);return false});PopupMenu.create(j,k)}return j},_buildNewRender:function(){var h=b.HDABaseView.prototype._buildNewRender.call(this);h.find(".dataset-deleted-msg").append(_l(' Click <a href="javascript:void(0);" class="dataset-undelete">here</a> to undelete it or <a href="javascript:void(0);" class="dataset-purge">here</a> to immediately remove it from disk'));h.find(".dataset-hidden-msg").append(_l(' Click <a href="javascript:void(0);" class="dataset-unhide">here</a> to unhide it'));return h},_render_body_failed_metadata:function(){var i=$("<a/>").attr({href:this.urls.edit,target:this.linkTarget}).text(_l("set it manually or retry auto-detection")),h=$("<span/>").text(". "+_l("You may be able to")+" ").append(i),j=b.HDABaseView.prototype._render_body_failed_metadata.call(this);j.find(".warningmessagesmall strong").append(h);return j},_render_body_error:function(){var h=b.HDABaseView.prototype._render_body_error.call(this);h.find(".dataset-actions .left").prepend(this._render_errButton());return h},_render_body_ok:function(){var h=b.HDABaseView.prototype._render_body_ok.call(this);if(this.model.isDeletedOrPurged()){return h}this.makeDbkeyEditLink(h);if(this.hasUser){h.find(".dataset-actions .left").append(this._render_visualizationsButton());this._renderTags(h);this._renderAnnotation(h)}return h},_renderTags:function(h){var i=this;this.tagsEditor=new a.TagsEditor({model:this.model,el:h.find(".tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){i.tagsEditorShown=true},onhide:function(){i.tagsEditorShown=false},$activator:faIconButton({title:_l("Edit dataset tags"),classes:"dataset-tag-btn",faIcon:"fa-tags"}).appendTo(h.find(".dataset-actions .right"))});if(this.tagsEditorShown){this.tagsEditor.toggle(true)}},_renderAnnotation:function(h){var i=this;this.annotationEditor=new e.AnnotationEditor({model:this.model,el:h.find(".annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){i.annotationEditorShown=true},onhide:function(){i.annotationEditorShown=false},$activator:faIconButton({title:_l("Edit dataset annotation"),classes:"dataset-annotate-btn",faIcon:"fa-comment"}).appendTo(h.find(".dataset-actions .right"))});if(this.annotationEditorShown){this.annotationEditor.toggle(true)}},makeDbkeyEditLink:function(i){if(this.model.get("metadata_dbkey")==="?"&&!this.model.isDeletedOrPurged()){var h=$('<a class="value">?</a>').attr("href",this.urls.edit).attr("target",this.linkTarget);i.find(".dataset-dbkey .value").replaceWith(h)}},events:_.extend(_.clone(b.HDABaseView.prototype.events),{"click .dataset-undelete":function(h){this.model.undelete();return false},"click .dataset-unhide":function(h){this.model.unhide();return false},"click .dataset-purge":"confirmPurge"}),confirmPurge:function d(h){this.model.purge();return false},toString:function(){var h=(this.model)?(this.model+""):("(no model)");return"HDAView("+h+")"}});function c(h,j,i){return function(){var k={};if(i){k["f-dbkey"]=i}$.ajax({url:h+"/list_tracks?"+$.param(k),dataType:"html",error:function(){alert(("Could not add this dataset to browser")+".")},success:function(l){var m=window.parent;m.Galaxy.modal.show({title:"View Data in a New or Saved Visualization",buttons:{Cancel:function(){m.Galaxy.modal.hide()},"View in saved visualization":function(){m.Galaxy.modal.show({title:"Add Data to Saved Visualization",body:l,buttons:{Cancel:function(){m.Galaxy.modal.hide()},"Add to visualization":function(){$(m.document).find("input[name=id]:checked").each(function(){m.Galaxy.modal.hide();var n=$(this).val();j.id=n;m.Galaxy.frame.add({title:"Trackster",type:"url",content:h+"/trackster?"+$.param(j)})})}}})},"View in new visualization":function(){m.Galaxy.modal.hide();var n=h+"/trackster?"+$.param(j);m.Galaxy.frame.add({title:"Trackster",type:"url",content:n})}}})}});return false}}return{HDAEditView:g}});
\ No newline at end of file
diff -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a -r 8346ec4baa3992f4dc0161f0fc79a0ba893c0a63 static/scripts/packed/mvc/dataset/hda-model.js
--- a/static/scripts/packed/mvc/dataset/hda-model.js
+++ b/static/scripts/packed/mvc/dataset/hda-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc"],function(b){var e=Backbone.Model.extend(b.LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"new",deleted:false,visible:true,accessible:true,purged:false,data_type:"",file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",tags:[],annotation:""},urlRoot:galaxy_config.root+"api/histories/",url:function(){return this.urlRoot+this.get("history_id")+"/contents/"+this.get("id")},urls:function(){var j=this.get("id");if(!j){return{}}var i={purge:galaxy_config.root+"datasets/"+j+"/purge_async",display:galaxy_config.root+"datasets/"+j+"/display/?preview=True",edit:galaxy_config.root+"datasets/"+j+"/edit",download:galaxy_config.root+"datasets/"+j+"/display?to_ext="+this.get("file_ext"),report_error:galaxy_config.root+"dataset/errors?id="+j,rerun:galaxy_config.root+"tool_runner/rerun?id="+j,show_params:galaxy_config.root+"datasets/"+j+"/show_params",visualization:galaxy_config.root+"visualization",annotation:{get:galaxy_config.root+"dataset/get_annotation_async?id="+j,set:galaxy_config.root+"dataset/annotate_async?id="+j},meta_download:galaxy_config.root+"dataset/get_metadata_file?hda_id="+j+"&metadata_name="};return i},initialize:function(i){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",e.STATES.NOT_VIEWABLE)}this._setUpListeners()},_setUpListeners:function(){this.on("change:state",function(j,i){this.log(this+" has changed state:",j,i);if(this.inReadyState()){this.trigger("state:ready",j,i,this.previous("state"))}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(j,k){var i=true;if((!j)&&(this.get("deleted")||this.get("purged"))){i=false}if((!k)&&(!this.get("visible"))){i=false}return i},hidden:function(){return !this.get("visible")},inReadyState:function(){var i=_.contains(e.READY_STATES,this.get("state"));return(this.isDeletedOrPurged()||i)},hasDetails:function(){return _.has(this.attributes,"genome_build")},hasData:function(){return(this.get("file_size")>0)},"delete":function d(i){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},i)},undelete:function a(i){if(!this.get("deleted")||this.get("purged")){return jQuery.when()}return this.save({deleted:false},i)},hide:function c(i){if(!this.get("visible")){return jQuery.when()}return this.save({visible:false},i)},unhide:function h(i){if(this.get("visible")){return jQuery.when()}return this.save({visible:true},i)},purge:function g(i){if(this.get("purged")){return jQuery.when()}i=i||{};i.url=galaxy_config.root+"datasets/"+this.get("id")+"/purge_async";var j=this,k=jQuery.ajax(i);k.done(function(n,l,m){j.set({deleted:true,purged:true})});k.fail(function(p,l,o){var m=_l("Unable to purge dataset");var n=("Removal of datasets by users is not allowed in this Galaxy instance");if(p.responseJSON&&p.responseJSON.error){m=p.responseJSON.error}else{if(p.responseText.indexOf(n)!==-1){m=n}}p.responseText=m;j.trigger("error",j,p,i,_l(m),{error:m})});return k},searchAttributes:["name","file_ext","genome_build","misc_blurb","misc_info","annotation","tags"],searchAliases:{title:"name",format:"file_ext",database:"genome_build",blurb:"misc_blurb",description:"misc_blurb",info:"misc_info",tag:"tags"},searchAttribute:function(k,i){var j=this.get(k);if(!i||(j===undefined||j===null)){return false}if(_.isArray(j)){return this._searchArrayAttribute(j,i)}return(j.toString().toLowerCase().indexOf(i.toLowerCase())!==-1)},_searchArrayAttribute:function(j,i){i=i.toLowerCase();return _.any(j,function(k){return(k.toString().toLowerCase().indexOf(i.toLowerCase())!==-1)})},search:function(i){var j=this;return _.filter(this.searchAttributes,function(k){return j.searchAttribute(k,i)})},matches:function(j){var l="=",i=j.split(l);if(i.length>=2){var k=i[0];k=this.searchAliases[k]||k;return this.searchAttribute(k,i[1])}return !!this.search(j).length},matchesAll:function(j){var i=this;j=j.match(/(".*"|\w*=".*"|\S*)/g).filter(function(k){return !!k});return _.all(j,function(k){k=k.replace(/"/g,"");return i.matches(k)})},toString:function(){var i=this.get("id")||"";if(this.get("name")){i=this.get("hid")+' :"'+this.get("name")+'",'+i}return"HDA("+i+")"}});e.STATES={UPLOAD:"upload",QUEUED:"queued",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",PAUSED:"paused",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};e.READY_STATES=[e.STATES.NEW,e.STATES.OK,e.STATES.EMPTY,e.STATES.PAUSED,e.STATES.FAILED_METADATA,e.STATES.NOT_VIEWABLE,e.STATES.DISCARDED,e.STATES.ERROR];e.NOT_READY_STATES=[e.STATES.UPLOAD,e.STATES.QUEUED,e.STATES.RUNNING,e.STATES.SETTING_METADATA];var f=Backbone.Collection.extend(b.LoggableMixin).extend({model:e,urlRoot:galaxy_config.root+"api/histories",url:function(){return this.urlRoot+"/"+this.historyId+"/contents"},initialize:function(j,i){i=i||{};this.historyId=i.historyId},ids:function(){return this.map(function(i){return i.id})},notReady:function(){return this.filter(function(i){return !i.inReadyState()})},running:function(){var i=[];this.each(function(j){if(!j.inReadyState()){i.push(j.get("id"))}});return i},getByHid:function(i){return _.first(this.filter(function(j){return j.get("hid")===i}))},getVisible:function(i,l,k){k=k||[];var j=new f(this.filter(function(m){return m.isVisible(i,l)}));_.each(k,function(m){if(!_.isFunction(m)){return}j=new f(j.filter(m))});return j},haveDetails:function(){return this.all(function(i){return i.hasDetails()})},fetchAllDetails:function(j){j=j||{};var i={details:"all"};j.data=(j.data)?(_.extend(j.data,i)):(i);return this.fetch(j)},ajaxQueue:function(l,k){var j=jQuery.Deferred(),i=this.length,n=[];if(!i){j.resolve([]);return j}var m=this.chain().reverse().map(function(p,o){return function(){var q=l.call(p,k);q.done(function(r){j.notify({curr:o,total:i,response:r,model:p})});q.always(function(r){n.push(r);if(m.length){m.shift()()}else{j.resolve(n)}})}}).value();m.shift()();return j},matches:function(i){return this.filter(function(j){return j.matches(i)})},set:function(k,i){var j=this;k=_.map(k,function(m){var n=j.get(m.id);if(!n){return m}var l=n.toJSON();_.extend(l,m);return l});Backbone.Collection.prototype.set.call(this,k,i)},toString:function(){return(["HDACollection(",[this.historyId,this.length].join(),")"].join(""))}});return{HistoryDatasetAssociation:e,HDACollection:f}});
\ No newline at end of file
+define(["mvc/base-mvc"],function(b){var e=Backbone.Model.extend(b.LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"new",deleted:false,visible:true,accessible:true,purged:false,data_type:"",file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",tags:[],annotation:""},urlRoot:galaxy_config.root+"api/histories/",url:function(){return this.urlRoot+this.get("history_id")+"/contents/"+this.get("id")},urls:function(){var j=this.get("id");if(!j){return{}}var i={purge:galaxy_config.root+"datasets/"+j+"/purge_async",display:galaxy_config.root+"datasets/"+j+"/display/?preview=True",edit:galaxy_config.root+"datasets/"+j+"/edit",download:galaxy_config.root+"datasets/"+j+"/display?to_ext="+this.get("file_ext"),report_error:galaxy_config.root+"dataset/errors?id="+j,rerun:galaxy_config.root+"tool_runner/rerun?id="+j,show_params:galaxy_config.root+"datasets/"+j+"/show_params",visualization:galaxy_config.root+"visualization",annotation:{get:galaxy_config.root+"dataset/get_annotation_async?id="+j,set:galaxy_config.root+"dataset/annotate_async?id="+j},meta_download:galaxy_config.root+"dataset/get_metadata_file?hda_id="+j+"&metadata_name="};return i},initialize:function(i){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",e.STATES.NOT_VIEWABLE)}this._setUpListeners()},_setUpListeners:function(){this.on("change:state",function(j,i){this.log(this+" has changed state:",j,i);if(this.inReadyState()){this.trigger("state:ready",j,i,this.previous("state"))}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(j,k){var i=true;if((!j)&&(this.get("deleted")||this.get("purged"))){i=false}if((!k)&&(!this.get("visible"))){i=false}return i},hidden:function(){return !this.get("visible")},inReadyState:function(){var i=_.contains(e.READY_STATES,this.get("state"));return(this.isDeletedOrPurged()||i)},hasDetails:function(){return _.has(this.attributes,"genome_build")},hasData:function(){return(this.get("file_size")>0)},"delete":function d(i){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},i)},undelete:function a(i){if(!this.get("deleted")||this.get("purged")){return jQuery.when()}return this.save({deleted:false},i)},hide:function c(i){if(!this.get("visible")){return jQuery.when()}return this.save({visible:false},i)},unhide:function h(i){if(this.get("visible")){return jQuery.when()}return this.save({visible:true},i)},purge:function g(i){if(this.get("purged")){return jQuery.when()}i=i||{};i.url=galaxy_config.root+"datasets/"+this.get("id")+"/purge_async";var j=this,k=jQuery.ajax(i);k.done(function(n,l,m){j.set({deleted:true,purged:true})});k.fail(function(p,l,o){var m=_l("Unable to purge dataset");var n=("Removal of datasets by users is not allowed in this Galaxy instance");if(p.responseJSON&&p.responseJSON.error){m=p.responseJSON.error}else{if(p.responseText.indexOf(n)!==-1){m=n}}p.responseText=m;j.trigger("error",j,p,i,_l(m),{error:m})});return k},searchAttributes:["name","file_ext","genome_build","misc_blurb","misc_info","annotation","tags"],searchAliases:{title:"name",format:"file_ext",database:"genome_build",blurb:"misc_blurb",description:"misc_blurb",info:"misc_info",tag:"tags"},searchAttribute:function(k,i){var j=this.get(k);if(!i||(j===undefined||j===null)){return false}if(_.isArray(j)){return this._searchArrayAttribute(j,i)}return(j.toString().toLowerCase().indexOf(i.toLowerCase())!==-1)},_searchArrayAttribute:function(j,i){i=i.toLowerCase();return _.any(j,function(k){return(k.toString().toLowerCase().indexOf(i.toLowerCase())!==-1)})},search:function(i){var j=this;return _.filter(this.searchAttributes,function(k){return j.searchAttribute(k,i)})},matches:function(j){var l="=",i=j.split(l);if(i.length>=2){var k=i[0];k=this.searchAliases[k]||k;return this.searchAttribute(k,i[1])}return !!this.search(j).length},matchesAll:function(j){var i=this;j=j.match(/(".*"|\w*=".*"|\S*)/g).filter(function(k){return !!k});return _.all(j,function(k){k=k.replace(/"/g,"");return i.matches(k)})},toString:function(){var i=this.get("id")||"";if(this.get("name")){i=this.get("hid")+' :"'+this.get("name")+'",'+i}return"HDA("+i+")"}});e.STATES={UPLOAD:"upload",QUEUED:"queued",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",PAUSED:"paused",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};e.READY_STATES=[e.STATES.OK,e.STATES.EMPTY,e.STATES.PAUSED,e.STATES.FAILED_METADATA,e.STATES.NOT_VIEWABLE,e.STATES.DISCARDED,e.STATES.ERROR];e.NOT_READY_STATES=[e.STATES.UPLOAD,e.STATES.QUEUED,e.STATES.RUNNING,e.STATES.SETTING_METADATA,e.STATES.NEW];var f=Backbone.Collection.extend(b.LoggableMixin).extend({model:e,urlRoot:galaxy_config.root+"api/histories",url:function(){return this.urlRoot+"/"+this.historyId+"/contents"},initialize:function(j,i){i=i||{};this.historyId=i.historyId},ids:function(){return this.map(function(i){return i.id})},notReady:function(){return this.filter(function(i){return !i.inReadyState()})},running:function(){var i=[];this.each(function(j){if(!j.inReadyState()){i.push(j.get("id"))}});return i},getByHid:function(i){return _.first(this.filter(function(j){return j.get("hid")===i}))},getVisible:function(i,l,k){k=k||[];var j=new f(this.filter(function(m){return m.isVisible(i,l)}));_.each(k,function(m){if(!_.isFunction(m)){return}j=new f(j.filter(m))});return j},haveDetails:function(){return this.all(function(i){return i.hasDetails()})},fetchAllDetails:function(j){j=j||{};var i={details:"all"};j.data=(j.data)?(_.extend(j.data,i)):(i);return this.fetch(j)},ajaxQueue:function(l,k){var j=jQuery.Deferred(),i=this.length,n=[];if(!i){j.resolve([]);return j}var m=this.chain().reverse().map(function(p,o){return function(){var q=l.call(p,k);q.done(function(r){j.notify({curr:o,total:i,response:r,model:p})});q.always(function(r){n.push(r);if(m.length){m.shift()()}else{j.resolve(n)}})}}).value();m.shift()();return j},matches:function(i){return this.filter(function(j){return j.matches(i)})},set:function(k,i){var j=this;k=_.map(k,function(m){var n=j.get(m.id);if(!n){return m}var l=n.toJSON();_.extend(l,m);return l});Backbone.Collection.prototype.set.call(this,k,i)},toString:function(){return(["HDACollection(",[this.historyId,this.length].join(),")"].join(""))}});return{HistoryDatasetAssociation:e,HDACollection:f}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8c4e3b85aa3b/
Changeset: 8c4e3b85aa3b
Branch: next-stable
User: natefoo
Date: 2014-04-15 01:26:24
Summary: Close next-stable branch.
Affected #: 0 files
https://bitbucket.org/galaxy/galaxy-central/commits/9e53251b0b7e/
Changeset: 9e53251b0b7e
Branch: stable
User: natefoo
Date: 2014-04-15 01:27:21
Summary: Update stable branch from next-stable for release.
Affected #: 749 files
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc .hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -77,6 +77,7 @@
tool-data/shared/ucsc/builds.txt
tool-data/shared/ensembl/builds.txt
tool-data/shared/ucsc/publicbuilds.txt
+tool-data/shared/ucsc/ucsc_build_sites.txt
tool-data/*.loc
tool-data/genome/*
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc README.txt
--- a/README.txt
+++ b/README.txt
@@ -26,6 +26,6 @@
on adding tools can be found on the Galaxy website (linked above).
Not all dependencies are included for the tools provided in the sample
-tool_conf.xml. A full list of external dependencies is available at:
+tool_conf.xml. A full list of external dependencies is available at:
-http://wiki.g2.bx.psu.edu/Admin/Tools/Tool%20Dependencies
+https://wiki.galaxyproject.org/Admin/Tools/ToolDependencies
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/additional_template_paths.xml
--- /dev/null
+++ b/config/plugins/visualizations/additional_template_paths.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- these relative paths can contain common templates importable by all visualization plugins -->
+<paths>
+ <path>common/templates</path>
+</paths>
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/Gruntfile.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/Gruntfile.js
@@ -0,0 +1,24 @@
+// NOTE: use 'sudo npm install .', then 'grunt' to use this file
+module.exports = function(grunt) {
+ grunt.initConfig({
+ pkg: grunt.file.readJSON('package.json'),
+ requirejs: {
+ compile: {
+ options: {
+ baseUrl : "../../../../static/scripts/",
+ paths : {
+ "plugin": "../../config/plugins/visualizations/charts/static"
+ },
+ shim : {
+ "libs/underscore": { exports: "_" },
+ "libs/backbone/backbone": { exports: "Backbone" }
+ },
+ name : "plugin/app",
+ out : "static/build-app.js",
+ }
+ }
+ }
+ });
+ grunt.loadNpmTasks('grunt-contrib-requirejs');
+ grunt.registerTask( 'default', [ 'requirejs' ]);
+};
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/config/charts.xml
--- a/config/plugins/visualizations/charts/config/charts.xml
+++ b/config/plugins/visualizations/charts/config/charts.xml
@@ -7,15 +7,9 @@
<test type="isinstance" test_attr="datatype" result_type="datatype">tabular.Tabular</test><to_param param_attr="id">dataset_id</to_param></data_source>
- <data_source>
- <model_class>Visualization</model_class>
- <test test_attr="type">charts</test>
- <to_param param_attr="id">visualization_id</to_param>
- </data_source></data_sources><params><param type="dataset" var_name_in_template="hda" required="true">dataset_id</param>
- <param type="visualization" var_name_in_template="visualization">visualization_id</param></params><template>charts.mako</template></visualization>
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/package.json
--- /dev/null
+++ b/config/plugins/visualizations/charts/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "galaxy-charts",
+ "version": "0.0.0",
+ "description": "Charts visualization plugin for the Galaxy informatics framework",
+ "main": " ",
+ "keywords": [
+ "galaxy",
+ "visualization",
+ "d3"
+ ],
+ "author": "Aysam Guerler",
+ "license": "BSD",
+ "devDependencies": {
+ "grunt": "~0.4.1",
+ "grunt-cli": "~0.1.9",
+ "grunt-contrib-requirejs": "~0.4.3"
+ }
+}
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/app.js
--- a/config/plugins/visualizations/charts/static/app.js
+++ b/config/plugins/visualizations/charts/static/app.js
@@ -1,10 +1,12 @@
// dependencies
-define(['library/portlet', 'library/ui', 'library/utils',
- 'views/charts', 'views/viewport', 'views/chart', 'views/group',
- 'models/config', 'models/datasets', 'models/chart', 'models/charts', 'models/group', 'models/types'],
- function( Portlet, Ui, Utils,
- ChartsView, ViewportView, ChartView, GroupView,
- Config, Datasets, Chart, Charts, Group, Types
+define(['mvc/ui/ui-modal', 'mvc/ui/ui-portlet', 'plugin/library/ui', 'utils/utils',
+ 'plugin/library/jobs', 'plugin/library/datasets', 'plugin/library/storage',
+ 'plugin/views/viewer', 'plugin/views/editor',
+ 'plugin/models/config', 'plugin/models/chart',
+ 'plugin/charts/types'],
+ function( Modal, Portlet, Ui, Utils, Jobs, Datasets, Storage,
+ ViewerView, EditorView,
+ Config, Chart, Types
) {
// widget
@@ -13,66 +15,75 @@
// initialize
initialize: function(options)
{
+ // deactivate all debugs outputs
+ //window.console.debug = function() {};
+
// link options
this.options = options;
- // link galaxy
- this.modal = parent.Galaxy.modal;
+ // link galaxy modal or create one
+ if (Galaxy && Galaxy.modal) {
+ this.modal = Galaxy.modal;
+ } else {
+ this.modal = new Modal.View();
+ }
- // create configuration model
+ //
+ // models
+ //
this.config = new Config();
-
- // create chart models
this.types = new Types();
this.chart = new Chart();
- this.charts = new Charts();
- this.group = new Group();
- // create dataset handler
+ //
+ // libraries
+ //
+ this.jobs = new Jobs(this);
this.datasets = new Datasets(this);
+ this.storage = new Storage(this);
- // create views
- this.charts_view = new ChartsView(this);
- this.group_view = new GroupView(this);
- this.chart_view = new ChartView(this);
- this.viewport_view = new ViewportView(this);
-
- // append view port to charts viewer
- this.charts_view.append(this.viewport_view.$el);
-
- // create portlet
- if (!this.options.config.widget) {
- this.portlet = new Portlet({icon : 'fa-bar-chart-o', label : 'Charts'});
- } else {
- this.portlet = $('<div></div>');
- }
+ //
+ // views
+ //
+ this.viewer_view = new ViewerView(this);
+ this.editor_view = new EditorView(this);
// append views
- this.portlet.append(this.charts_view.$el);
- this.portlet.append(this.group_view.$el);
- this.portlet.append(this.chart_view.$el);
-
- // set element
- if (!this.options.config.widget) {
- this.setElement(this.portlet.$el);
+ this.$el.append(this.viewer_view.$el);
+ this.$el.append(this.editor_view.$el);
+
+ // pick start screen
+ if (!this.storage.load()) {
+ // show editor
+ this.go('editor');
} else {
- this.setElement(this.portlet);
+ // show viewport
+ this.go('viewer');
+
+ // draw chart
+ var self = this;
+ this.chart.deferred.execute(function() {
+ self.chart.trigger('redraw');
+ });
}
-
- // hide views
- this.group_view.$el.hide();
- this.charts_view.$el.hide();
-
- // events
- var self = this;
- this.config.on('change:current_view', function() {
- self._showCurrent();
- });
},
- // current view
- _showCurrent: function() {
+ // loads a view and makes sure that all others are hidden
+ go: function(view_id) {
+ // hide all tooltips
+ $('.tooltip').hide();
+ // pick view
+ switch (view_id) {
+ case 'editor' :
+ this.editor_view.show();
+ this.viewer_view.hide();
+ break;
+ case 'viewer' :
+ this.editor_view.hide();
+ this.viewer_view.show();
+ break;
+ }
},
// execute command
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/build-app.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/build-app.js
@@ -0,0 +1,6 @@
+// Underscore.js 1.4.4
+// http://underscorejs.org
+// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore may be freely distributed under the MIT license.
+
+(function(){var e=this,t=e._,n={},r=Array.prototype,i=Object.prototype,s=Function.prototype,o=r.push,u=r.slice,a=r.concat,f=i.toString,l=i.hasOwnProperty,c=r.forEach,h=r.map,p=r.reduce,d=r.reduceRight,v=r.filter,m=r.every,g=r.some,y=r.indexOf,b=r.lastIndexOf,w=Array.isArray,E=Object.keys,S=s.bind,x=function(e){if(e instanceof x)return e;if(!(this instanceof x))return new x(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=x),exports._=x):e._=x,x.VERSION="1.4.4";var T=x.each=x.forEach=function(e,t,r){if(e==null)return;if(c&&e.forEach===c)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(t.call(r,e[i],i,e)===n)return}else for(var o in e)if(x.has(e,o)&&t.call(r,e[o],o,e)===n)return};x.map=x.collect=function(e,t,n){var r=[];return e==null?r:h&&e.map===h?e.map(t,n):(T(e,function(e,i,s){r.push(t.call(n,e,i,s))}),r)};var N="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(p&&e.reduce===p)return r&&(t=x.bind(t,r)),i?e.reduce(t,n):e.reduce(t);T(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(N);return n},x.reduceRight=x.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(d&&e.reduceRight===d)return r&&(t=x.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=x.keys(e);s=o.length}T(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(N);return n},x.find=x.detect=function(e,t,n){var r;return C(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},x.filter=x.select=function(e,t,n){var r=[];return e==null?r:v&&e.filter===v?e.filter(t,n):(T(e,function(e,i,s){t.call(n,e,i,s)&&r.push(e)}),r)},x.reject=function(e,t,n){return x.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},x.every=x.all=function(e,t,r){t||(t=x.identity);var i=!0;return e==null?i:m&&e.every===m?e.every(t,r):(T(e,function(e,s,o){if(!(i=i&&t.call(r,e,s,o)))return n}),!!i)};var C=x.some=x.any=function(e,t,r){t||(t=x.identity);var i=!1;return e==null?i:g&&e.some===g?e.some(t,r):(T(e,function(e,s,o){if(i||(i=t.call(r,e,s,o)))return n}),!!i)};x.contains=x.include=function(e,t){return e==null?!1:y&&e.indexOf===y?e.indexOf(t)!=-1:C(e,function(e){return e===t})},x.invoke=function(e,t){var n=u.call(arguments,2),r=x.isFunction(t);return x.map(e,function(e){return(r?t:e[t]).apply(e,n)})},x.pluck=function(e,t){return x.map(e,function(e){return e[t]})},x.where=function(e,t,n){return x.isEmpty(t)?n?void 0:[]:x[n?"find":"filter"](e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},x.findWhere=function(e,t){return x.where(e,t,!0)},x.max=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&x.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},x.min=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&x.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o<r.computed&&(r={value:e,computed:o})}),r.value},x.shuffle=function(e){var t,n=0,r=[];return T(e,function(e){t=x.random(n++),r[n-1]=r[t],r[t]=e}),r};var k=function(e){return x.isFunction(e)?e:function(t){return t[e]}};x.sortBy=function(e,t,n){var r=k(t);return x.pluck(x.map(e,function(e,t,i){return{value:e,index:t,criteria:r.call(n,e,t,i)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index<t.index?-1:1}),"value")};var L=function(e,t,n,r){var i={},s=k(t==null?x.identity:t);return T(e,function(t,o){var u=s.call(n,t,o,e);r(i,u,t)}),i};x.groupBy=function(e,t,n){return L(e,t,n,function(e,t,n){(x.has(e,t)?e[t]:e[t]=[]).push(n)})},x.countBy=function(e,t,n){return L(e,t,n,function(e,t){x.has(e,t)||(e[t]=0),e[t]++})},x.sortedIndex=function(e,t,n,r){n=n==null?x.identity:k(n);var i=n.call(r,t),s=0,o=e.length;while(s<o){var u=s+o>>>1;n.call(r,e[u])<i?s=u+1:o=u}return s},x.toArray=function(e){return e?x.isArray(e)?u.call(e):e.length===+e.length?x.map(e,x.identity):x.values(e):[]},x.size=function(e){return e==null?0:e.length===+e.length?e.length:x.keys(e).length},x.first=x.head=x.take=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,0,t):e[0]},x.initial=function(e,t,n){return u.call(e,0,e.length-(t==null||n?1:t))},x.last=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,Math.max(e.length-t,0)):e[e.length-1]},x.rest=x.tail=x.drop=function(e,t,n){return u.call(e,t==null||n?1:t)},x.compact=function(e){return x.filter(e,x.identity)};var A=function(e,t,n){return T(e,function(e){x.isArray(e)?t?o.apply(n,e):A(e,t,n):n.push(e)}),n};x.flatten=function(e,t){return A(e,t,[])},x.without=function(e){return x.difference(e,u.call(arguments,1))},x.uniq=x.unique=function(e,t,n,r){x.isFunction(t)&&(r=n,n=t,t=!1);var i=n?x.map(e,n,r):e,s=[],o=[];return T(i,function(n,r){if(t?!r||o[o.length-1]!==n:!x.contains(o,n))o.push(n),s.push(e[r])}),s},x.union=function(){return x.uniq(a.apply(r,arguments))},x.intersection=function(e){var t=u.call(arguments,1);return x.filter(x.uniq(e),function(e){return x.every(t,function(t){return x.indexOf(t,e)>=0})})},x.difference=function(e){var t=a.apply(r,u.call(arguments,1));return x.filter(e,function(e){return!x.contains(t,e)})},x.zip=function(){var e=u.call(arguments),t=x.max(x.pluck(e,"length")),n=new Array(t);for(var r=0;r<t;r++)n[r]=x.pluck(e,""+r);return n},x.unzip=function(e){var t=[];return x.each(e,function(e,n){x.each(e,function(e,r){t.length<=r&&(t[r]=[]),t[r][n]=e})}),t},x.object=function(e,t){if(e==null)return{};var n={};for(var r=0,i=e.length;r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},x.indexOf=function(e,t,n){if(e==null)return-1;var r=0,i=e.length;if(n){if(typeof n!="number")return r=x.sortedIndex(e,t),e[r]===t?r:-1;r=n<0?Math.max(0,i+n):n}if(y&&e.indexOf===y)return e.indexOf(t,n);for(;r<i;r++)if(e[r]===t)return r;return-1},x.lastIndexOf=function(e,t,n){if(e==null)return-1;var r=n!=null;if(b&&e.lastIndexOf===b)return r?e.lastIndexOf(t,n):e.lastIndexOf(t);var i=r?n:e.length;while(i--)if(e[i]===t)return i;return-1},x.range=function(e,t,n){arguments.length<=1&&(t=e||0,e=0),n=arguments[2]||1;var r=Math.max(Math.ceil((t-e)/n),0),i=0,s=new Array(r);while(i<r)s[i++]=e,e+=n;return s};var O=function(){};x.bind=function(e,t){var n,r;if(e.bind===S&&S)return S.apply(e,u.call(arguments,1));if(!x.isFunction(e))throw new TypeError;return n=u.call(arguments,2),r=function(){if(this instanceof r){O.prototype=e.prototype;var i=new O;O.prototype=null;var s=e.apply(i,n.concat(u.call(arguments)));return Object(s)===s?s:i}return e.apply(t,n.concat(u.call(arguments)))}},x.partial=function(e){var t=u.call(arguments,1);return function(){return e.apply(this,t.concat(u.call(arguments)))}},x.bindAll=function(e){var t=u.call(arguments,1);if(t.length===0)throw new Error("bindAll must be passed function names");return T(t,function(t){e[t]=x.bind(e[t],e)}),e},x.memoize=function(e,t){var n={};return t||(t=x.identity),function(){var r=t.apply(this,arguments);return x.has(n,r)?n[r]:n[r]=e.apply(this,arguments)}},x.delay=function(e,t){var n=u.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},x.defer=function(e){return x.delay.apply(x,[e,1].concat(u.call(arguments,1)))},x.throttle=function(e,t,n){var r,i,s,o,u=0,a=function(){u=new Date,s=null,o=e.apply(r,i)};return function(){var f=new Date;!u&&n===!1&&(u=f);var l=t-(f-u);return r=this,i=arguments,l<=0?(clearTimeout(s),s=null,u=f,o=e.apply(r,i)):s||(s=setTimeout(a,l)),o}},x.debounce=function(e,t,n){var r,i;return function(){var s=this,o=arguments,u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r;return clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},x.once=function(e){var t=!1,n;return function(){return t?n:(t=!0,n=e.apply(this,arguments),e=null,n)}},x.wrap=function(e,t){return function(){var n=[e];return o.apply(n,arguments),t.apply(this,n)}},x.compose=function(){var e=arguments;return function(){var t=arguments;for(var n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},x.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},x.keys=E||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)x.has(e,n)&&t.push(n);return t},x.values=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push(e[n]);return t},x.pairs=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push([n,e[n]]);return t},x.invert=function(e){var t={};for(var n in e)x.has(e,n)&&(t[e[n]]=n);return t},x.functions=x.methods=function(e){var t=[];for(var n in e)x.isFunction(e[n])&&t.push(n);return t.sort()},x.extend=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},x.pick=function(e){var t={},n=a.apply(r,u.call(arguments,1));return T(n,function(n){n in e&&(t[n]=e[n])}),t},x.omit=function(e){var t={},n=a.apply(r,u.call(arguments,1));for(var i in e)x.contains(n,i)||(t[i]=e[i]);return t},x.defaults=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]===void 0&&(e[n]=t[n])}),e},x.clone=function(e){return x.isObject(e)?x.isArray(e)?e.slice():x.extend({},e):e},x.tap=function(e,t){return t(e),e};var M=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof x&&(e=e._wrapped),t instanceof x&&(t=t._wrapped);var i=f.call(e);if(i!=f.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=M(e[o],t[o],n,r)))break}else{var a=e.constructor,l=t.constructor;if(a!==l&&!(x.isFunction(a)&&a instanceof a&&x.isFunction(l)&&l instanceof l))return!1;for(var c in e)if(x.has(e,c)){o++;if(!(u=x.has(t,c)&&M(e[c],t[c],n,r)))break}if(u){for(c in t)if(x.has(t,c)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};x.isEqual=function(e,t){return M(e,t,[],[])},x.isEmpty=function(e){if(e==null)return!0;if(x.isArray(e)||x.isString(e))return e.length===0;for(var t in e)if(x.has(e,t))return!1;return!0},x.isElement=function(e){return!!e&&e.nodeType===1},x.isArray=w||function(e){return f.call(e)=="[object Array]"},x.isObject=function(e){return e===Object(e)},T(["Arguments","Function","String","Number","Date","RegExp"],function(e){x["is"+e]=function(t){return f.call(t)=="[object "+e+"]"}}),x.isArguments(arguments)||(x.isArguments=function(e){return!!e&&!!x.has(e,"callee")}),typeof /./!="function"&&(x.isFunction=function(e){return typeof e=="function"}),x.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},x.isNaN=function(e){return x.isNumber(e)&&e!=+e},x.isBoolean=function(e){return e===!0||e===!1||f.call(e)=="[object Boolean]"},x.isNull=function(e){return e===null},x.isUndefined=function(e){return e===void 0},x.has=function(e,t){return l.call(e,t)},x.noConflict=function(){return e._=t,this},x.identity=function(e){return e},x.times=function(e,t,n){var r=Array(e);for(var i=0;i<e;i++)r[i]=t.call(n,i);return r},x.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))};var _={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};_.unescape=x.invert(_.escape);var D={escape:new RegExp("["+x.keys(_.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(_.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(e){x[e]=function(t){return t==null?"":(""+t).replace(D[e],function(t){return _[e][t]})}}),x.result=function(e,t){if(e==null)return void 0;var n=e[t];return x.isFunction(n)?n.call(e):n},x.mixin=function(e){T(x.functions(e),function(t){var n=x[t]=e[t];x.prototype[t]=function(){var e=[this._wrapped];return o.apply(e,arguments),F.call(this,n.apply(x,e))}})};var P=0;x.uniqueId=function(e){var t=++P+"";return e?e+t:t},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},j=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(e,t,n){var r;n=x.defaults({},n,x.templateSettings);var i=new RegExp([(n.escape||H).source,(n.interpolate||H).source,(n.evaluate||H).source].join("|")+"|$","g"),s=0,o="__p+='";e.replace(i,function(t,n,r,i,u){return o+=e.slice(s,u).replace(j,function(e){return"\\"+B[e]}),n&&(o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(o+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(o+="';\n"+i+"\n__p+='"),s=u+t.length,t}),o+="';\n",n.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(n.variable||"obj","_",o)}catch(u){throw u.source=o,u}if(t)return r(t,x);var a=function(e){return r.call(this,e,x)};return a.source="function("+(n.variable||"obj")+"){\n"+o+"}",a},x.chain=function(e){return x(e).chain()};var F=function(e){return this._chain?x(e).chain():e};x.mixin(x),T(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];x.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],F.call(this,n)}}),T(["concat","join","slice"],function(e){var t=r[e];x.prototype[e]=function(){return F.call(this,t.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this),define("libs/underscore",function(e){return function(){var t,n;return t||e._}}(this)),define("utils/utils",["libs/underscore"],function(e){function t(e,t,r){n("GET",e,{},t,r)}function n(e,t,n,r,i){if(e=="GET"||e=="DELETE")t.indexOf("?")==-1?t+="?":t+="&",t+=$.param(n);var s=new XMLHttpRequest;s.open(e,t,!0),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Cache-Control","no-cache"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.setRequestHeader("Content-Type","application/json"),s.onloadend=function(){var e=s.status;try{response=jQuery.parseJSON(s.responseText)}catch(t){response=s.responseText}e==200?r&&r(response):i&&i(response)},e=="GET"||e=="DELETE"?s.send():s.send(JSON.stringify(n))}function r(e,t){var n=$('<div class="'+e+'"></div>');n.appendTo(":eq(0)");var r=n.css(t);return n.remove(),r}function i(e){$('link[href^="'+e+'"]').length||$('<link href="'+galaxy_config.root+e+'" rel="stylesheet">').appendTo("head")}function s(t,n){return t?e.defaults(t,n):n}function o(e,t){var n="";if(e>=1e11)e/=1e11,n="TB";else if(e>=1e8)e/=1e8,n="GB";else if(e>=1e5)e/=1e5,n="MB";else if(e>=100)e/=100,n="KB";else{if(!(e>0))return"<strong>-</strong>";e*=10,n="b"}var r=Math.round(e)/10;return t?r+" "+n:"<strong>"+r+"</strong> "+n}function u(){return(new Date).getTime().toString(36)}function a(e){var t=$("<p></p>");return t.append(e),t}function f(){var e=new Date,t=(e.getHours()<10?"0":"")+e.getHours(),n=(e.getMinutes()<10?"0":"")+e.getMinutes(),r=e.getDate()+"/"+(e.getMonth()+1)+"/"+e.getFullYear()+", "+t+":"+n;return r}return{cssLoadFile:i,cssGetAttribute:r,get:t,merge:s,bytesToString:o,uuid:u,time:f,wrap:a,request:n}}),define("mvc/ui/ui-modal",["utils/utils"],function(e){var t=Backbone.View.extend({elMain:"body",optionsDefault:{title:"ui-modal",body:"",backdrop:!0,height:null,width:null,closing_events:!1},buttonList:{},initialize:function(e){e&&this._create(e)},show:function(e){this.initialize(e),this.options.height?(this.$body.css("height",this.options.height),this.$body.css("overflow","hidden")):this.$body.css("max-height",$(window).height()/2),this.options.width&&this.$dialog.css("width",this.options.width),this.visible?this.$el.show():this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.visible=!1,this.$el.fadeOut("fast")},enableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!1)},disableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!0)},showButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).show()},hideButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).hide()},getButton:function(e){var t=this.buttonList[e];return this.$buttons.find("#"+t)},scrollTop:function(){return this.$body.scrollTop()},_create:function(e){var t=this;this.options=_.defaults(e,this.optionsDefault),this.options.body=="progress"&&(this.options.body=$('<div class="progress progress-striped active"><div class="progress-bar progress-bar-info" style="width:100%"></div></div>')),this.$el&&(this.$el.remove(),$(document).off("keyup.ui-modal")),this.setElement(this._template(this.options.title)),this.$dialog=this.$el.find(".modal-dialog"),this.$body=this.$el.find(".modal-body"),this.$footer=this.$el.find(".modal-footer"),this.$buttons=this.$el.find(".buttons"),this.$backdrop=this.$el.find(".modal-backdrop"),this.$body.html(this.options.body),this.options.backdrop||this.$backdrop.removeClass("in");if(this.options.buttons){this.buttonList={};var n=0;$.each(this.options.buttons,function(e,r){var i="button-"+n++;t.$buttons.append($('<button id="'+i+'"></button>').text(e).click(r)).append(" "),t.buttonList[e]=i})}else this.$footer.hide();$(this.elMain).append($(this.el)),this.options.closing_events&&($(document).on("keyup.ui-modal",function(e){e.keyCode==27&&t.hide()}),this.$el.find(".modal-backdrop").on("click",function(){t.hide()}))},_template:function(e){return'<div class="modal"><div class="modal-backdrop fade in" style="z-index: -1;"></div><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" style="display: none;">×</button><h4 class="title">'+e+"</h4>"+"</div>"+'<div class="modal-body" style="position: static;"></div>'+'<div class="modal-footer">'+'<div class="buttons" style="float: right;"></div>'+"</div>"+"</div"+"</div>"+"</div>"}});return{View:t}}),define("mvc/ui/ui-portlet",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,optionsDefault:{title:"",icon:"",buttons:null,body:null,height:null,operations:null,placement:"bottom",overflow:"auto"},$title:null,$content:null,$buttons:null,$operations:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$content=this.$el.find("#content"),this.$title=this.$el.find("#title-text"),this.options.height&&(this.$el.find("#body").css("height",this.options.height),this.$el.find("#content").css("overflow",this.options.overflow)),this.$buttons=$(this.el).find("#buttons");if(this.options.buttons){var n=this;$.each(this.options.buttons,function(e,t){t.$el.prop("id",e),n.$buttons.append(t.$el)})}else this.$buttons.remove();this.$operations=$(this.el).find("#operations");if(this.options.operations){var n=this;$.each(this.options.operations,function(e,t){t.$el.prop("id",e),n.$operations.append(t.$el)})}this.options.body&&this.append(this.options.body)},append:function(t){this.$content.append(e.wrap(t))},content:function(){return this.$content},show:function(){this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},enableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!1)},disableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!0)},hideOperation:function(e){this.$operations.find("#"+e).hide()},showOperation:function(e){this.$operations.find("#"+e).show()},setOperation:function(e,t){var n=this.$operations.find("#"+e);n.off("click"),n.on("click",t)},title:function(e){var t=this.$title;return e&&t.html(e),t.html()},_template:function(e){var t='<div class="toolForm portlet-view no-highlight">';if(e.title||e.icon)t+='<div id="title" class="toolFormTitle portlet-title"><div id="operations" class="portlet-operations"/><div style="overflow: hidden;">',e.icon&&(t+='<div class="portlet-title-icon fa '+e.icon+'"> </div>'),t+='<div id="title-text" class="portlet-title-text">'+e.title+"</div>",t+="</div></div>";return t+='<div id="body" class="toolFormBody portlet-body">',e.placement=="top"&&(t+='<div id="buttons" class="portlet-buttons"/>'),t+='<div id="content" class="portlet-content"/>',e.placement=="bottom"&&(t+='<div id="buttons" class="portlet-buttons"/>'),t+="</div></div>",t}});return{View:t}}),define("plugin/library/ui-select",["utils/utils"],function(e){var t=Backbone.View.extend({optionsDefault:{id:"",cls:"",empty:"No data available",visible:!0,wait:!1},selected:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$select=this.$el.find("#select"),this.$icon=this.$el.find("#icon"),this.selected=this.options.value;var n=this;this.options.onchange&&this.$select.on("change",function(){n.value(n.$select.val())}),this._refresh(),this.options.visible||this.hide(),this.options.wait?this.wait():this.show()},value:function(e){var t=this.selected;e!==undefined&&(this.selected=e,this.$select.val(e));var n=this.selected;return n&&n!=t&&this.options.onchange&&this.options.onchange(n),n},text:function(){return this.$select.find("option:selected").text()},show:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-caret-down"),this.$select.show(),this.$el.show()},hide:function(){this.$el.hide()},wait:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-spinner fa-spin"),this.$select.hide()},disabled:function(){return this.$select.is(":disabled")},enable:function(){this.$select.prop("disabled",!1)},disable:function(){this.$select.prop("disabled",!0)},add:function(e){this.$select.append(this._templateOption(e)),this._refresh()},del:function(e){this.$select.find("option[value="+e+"]").remove(),this.$select.trigger("change"),this._refresh()},update:function(e){this.$select.find("option").remove();for(var t in e)this.$select.append(this._templateOption(e[t]));!this.selected&&e.length>0&&this.value(e[0].value),this._refresh()},_refresh:function(){this.$select.find("option[value=null]").remove();var e=this.$select.find("option").length;e==0?(this.$select.append(this._templateOption({value:"null",label:this.options.empty})),this.disable()):(this.enable(),this.selected&&this.$select.val(this.selected))},_exists:function(e){return 0!=this.$select.find("option[value="+e+"]").length},_templateOption:function(e){return'<option value="'+e.value+'">'+e.label+"</option>"},_template:function(e){var t='<div id="'+e.id+'" class="styled-select">'+'<div class="button">'+'<i id="icon"/>'+"</div>"+'<select id="select" class="select '+e.cls+" "+e.id+'">';for(key in e.data){var n=e.data[key],r="";if(n.value==e.value||n.value=="")r="selected";t+='<option value="'+n.value+'" '+r+">"+n.label+"</option>"}return t+="</select></div>",t}});return{View:t}}),define("plugin/library/ui",["utils/utils","plugin/library/ui-select"],function(e,t){var n=Backbone.View.extend({optionsDefault:{title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},title:function(e){this.$el.find("b").html(e)},_template:function(e){return"<label><b>"+e.title+"</b></label>"},value:function(){return options.title}}),r=Backbone.View.extend({optionsDefault:{id:null,title:"","float":"right",cls:"btn-default",icon:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t='<button id="'+e.id+'" type="submit" style="margin-right: 5px; float: '+e.float+';" type="button" class="btn '+e.cls+'">';return e.icon&&(t+='<i class="icon fa '+e.icon+'"></i> '),t+=e.title+"</button>",t}}),i=Backbone.View.extend({optionsDefault:{"float":"right",icon:"",tooltip:"",placement:"bottom",title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){return'<div><span class="fa '+e.icon+'" style="font-size: 1.2em;"/> '+e.title+"</div>"}}),s=Backbone.View.extend({optionsDefault:{title:"",id:null,"float":"right",cls:"icon-btn",icon:"",tooltip:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t="";e.title&&(t="width: auto;");var n='<div id="'+e.id+'" style="margin-right: 5px; float: '+e.float+"; "+t+'" class="'+e.cls+'">';return e.title?n+='<div style="margin-right: 5px; margin-left: 5px;"><i class="icon fa '+e.icon+'"/> '+'<span style="position: relative; font-size: 0.8em; font-weight: normal; top: -1px;">'+e.title+"</span>"+"</div>":n+='<i class="icon fa '+e.icon+'"/>',n+="</div>",n}}),o=Backbone.View.extend({optionsDefault:{title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick)},_template:function(e){return'<div><a href="javascript:void(0)">'+e.title+"</a></div>"}}),u=Backbone.View.extend({optionsDefault:{message:"",status:"info",persistent:!1},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement("<div></div>")},update:function(t){this.options=e.merge(t,this.optionsDefault);if(t.message!=""){this.$el.html(this._template(this.options)),this.$el.fadeIn();if(!t.persistent){var n=this;window.setTimeout(function(){n.$el.is(":visible")?n.$el.fadeOut():n.$el.hide()},3e3)}}else this.$el.fadeOut()},_template:function(e){return'<div class="alert alert-'+e.status+'" style="padding: 2px 2px 2px 10px;">'+e.message+"</div>"}}),a=Backbone.View.extend({optionsDefault:{onclick:null,searchword:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options));var n=this;this.options.onclick&&this.$el.on("submit",function(e){var t=n.$el.find("#search");n.options.onclick(t.val())})},_template:function(e){return'<div class="search"><form onsubmit="return false;"><input id="search" class="form-control input-sm" type="text" name="search" placeholder="Search..." value="'+e.searchword+'">'+'<button type="submit" class="btn search-btn">'+'<i class="fa fa-search"></i>'+"</button>"+"</form>"+"</div>"}}),f=Backbone.View.extend({optionsDefault:{title:"Unlabeled",body:null},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.body&&this.$el.find(".body").append(this.options.body)},_template:function(e){return'<div id="title" class="title">'+e.title+":"+"</div>"}}),l=Backbone.View.extend({optionsDefault:{id:"",title:"",target:"",href:"",onunload:null,onclick:null,visible:!0,icon:null,tag:""},$menu:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement($(this._template(this.options)));var n=$(this.el).find(".root"),r=this;n.on("click",function(e){e.preventDefault(),r.options.onclick&&r.options.onclick()}),this.options.visible||this.hide()},show:function(){$(this.el).show()},hide:function(){$(this.el).hide()},addMenu:function(t){var n={title:"",target:"",href:"",onclick:null,divider:!1,icon:null};n=e.merge(t,n),this.$menu||($(this.el).append(this._templateMenu()),this.$menu=$(this.el).find(".menu"));var r=$(this._templateMenuItem(n));r.on("click",function(e){e.preventDefault(),n.onclick&&n.onclick()}),this.$menu.append(r),n.divider&&this.$menu.append($(this._templateDivider()))},_templateMenuItem:function(e){var t='<li><a href="'+e.href+'" target="'+e.target+'">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),t+=" "+e.title+"</a>"+"</li>",t},_templateMenu:function(){return'<ul class="menu dropdown-menu pull-right" role="menu"></ul>'},_templateDivider:function(){return'<li class="divider"></li>'},_template:function(e){var t='<div id="'+e.id+'" class="button-menu btn-group">'+'<button type="button" class="root btn btn-default dropdown-toggle" data-toggle="dropdown">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),"</button></div>",t}}),c=Backbone.View.extend({optionsDefault:{value:"",type:"text",placeholder:"",disabled:!1,visible:!0},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.disabled&&this.$el.prop("disabled",!0),this.options.visible||this.$el.hide();var n=this;this.options.onchange&&this.$el.on("input",function(){n.options.onchange()})},value:function(e){return e!==undefined&&this.$el.val(e),this.$el.val()},_template:function(e){return'<input id="'+e.id+'" type="'+e.type+'" value="'+e.value+'" placeholder="'+e.placeholder+'" class="form-control">'}});return{Label:n,Button:r,Icon:i,ButtonIcon:s,Input:c,Anchor:o,Message:u,Searchbox:a,Title:f,Select:t,ButtonMenu:l}}),define("plugin/library/jobs",["utils/utils"],function(e){return Backbone.Model.extend({initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},cleanup:function(t){var n=t.get("dataset_id_job");if(n!=""){var r=this;e.request("PUT",config.root+"api/histories/none/contents/"+n,{deleted:!0},function(){r._refreshHdas()}),t.set("dataset_id_job","")}},submit:function(t,n,r,i,s){var o=this,u=t.id,a=t.get("type"),f=this.app.types.get(a);data={tool_id:"chartskit",inputs:{input:{id:t.get("dataset_id"),src:"hda"},module:a,columns:r,settings:n}},t.state("wait","Sending job request..."),e.request("POST",config.root+"api/tools",data,function(e){if(!e.outputs||e.outputs.length==0)t.state("failed","Job submission failed. No response."),s&&s();else{o._refreshHdas();var n=e.outputs[0];t.state("wait","Job has been queued..."),t.set("dataset_id_job",n.id),this.app.storage.save(),o._loop(n.id,function(e){switch(e.state){case"ok":return t.state("wait","Job completed successfully..."),i(e),!0;case"error":return t.state("failed","Job has failed. Please check the history for details."),s&&s(),!0;case"running":return t.state("wait","Job is running..."),!1}})}},function(e){var n="";e&&e.message&&e.message.data&&e.message.data.input&&(n=e.message.data.input+"."),t.state("failed","This visualization requires the Charts-Kit. Please make sure it is installed. "+n),s&&s()})},_loop:function(t,n){var r=this;e.request("GET",config.root+"api/datasets/"+t,{},function(e){n(e)||setTimeout(function(){r._loop(t,n)},r.app.config.get("query_timeout"))})},_refreshHdas:function(){Galaxy&&Galaxy.currHistoryPanel&&Galaxy.currHistoryPanel.refreshHdas()}})}),define("plugin/library/datasets",["utils/utils"],function(e){return Backbone.Collection.extend({list:{},initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},request:function(t,n,r){var i=this;if(t.groups)this._fetch(t,n);else{var s=this.list[t.id];if(s){n(s);return}e.request("GET",config.root+"api/datasets/"+t.id,{},function(e){switch(e.state){case"error":r&&r(e);break;default:i.list[t.id]=e,n(e)}})}},_fetch:function(t,n){var r=t.start?t.start:0,i=Math.abs(t.end-t.start),s=this.app.config.get("query_limit");if(!i||i>s)i=s;var o="",u={},a=0;for(var f in t.groups){var l=t.groups[f];for(var c in l.columns){var h=l.columns[c];o+=h+",",u[h]=a,a++}}if(a==0){n({});return}o=o.substring(0,o.length-1);var p=t.groups.slice(0);for(var f in p)p[f].values=[];var d=this;e.request("GET",config.root+"api/datasets/"+t.id,{data_type:"raw_data",provider:"dataset-column",limit:i,offset:r,indeces:o},function(e){for(var i in e.data){var s=e.data[i];for(var o in t.groups){var a=t.groups[o],f={x:parseInt(i)+r};for(var l in a.columns){var c=a.columns[l],h=u[c],d=s[h];if(isNaN(d)||!d)d=0;f[l]=d}p[o].values.push(f)}}n(p)})}})}),define("plugin/models/group",[],function(){return Backbone.Model.extend({defaults:{key:"Data label",date:""},reset:function(){this.clear({silent:!0}).set(this.defaults),this.trigger("reset",this)}})}),define("plugin/models/groups",["plugin/models/group"],function(e){return Backbone.Collection.extend({model:e})}),define("plugin/library/deferred",["utils/utils"],function(e){return Backbone.Model.extend({queue:[],process:{},counter:0,initialize:function(){this.on("refresh",function(){if(this.counter==0)for(var e in this.queue)this.queue[e](),this.queue.splice(e,1)})},execute:function(e){this.queue.push(e),this.trigger("refresh")},register:function(){var t=e.uuid();return this.process[t]=!0,this.counter++,console.debug("Deferred:register() - Registering "+t),t},done:function(e){delete this.process[e],this.counter--,console.debug("Deferred:done() - Unregistering "+e),this.trigger("refresh")},ready:function(){return this.counter==0?!0:!1}})});var Visualization=Backbone.Model.extend({defaults:{config:{}},urlRoot:function(){var e="/api/visualizations";return window.galaxy_config&&galaxy_config.root?galaxy_config.root+e:e},initialize:function(e){_.isObject(e.config)&&_.isObject(this.defaults.config)&&_.defaults(e.config,this.defaults.config),this._setUpListeners()},_setUpListeners:function(){},set:function(e,t){if(e==="config"){var n=this.get("config");_.isObject(n)&&(t=_.extend(_.clone(n),t))}return Backbone.Model.prototype.set.call(this,e,t),this},toString:function(){var e=this.get("id")||"";return this.get("title")&&(e+=":"+this.get("title")),"Visualization("+e+")"}}),VisualizationCollection=Backbone.Collection.extend({model:Visualization,url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(e,t){t=t||{}},set:function(e,t){var n=this;e=_.map(e,function(e){var t=n.get(e.id);if(!t)return e;var r=t.toJSON();return _.extend(r,e),r}),Backbone.Collection.prototype.set.call(this,e,t)},toString:function(){return["VisualizationCollection(",[this.historyId,this.length].join(),")"].join("")}});define("mvc/visualization/visualization-model",function(){}),define("plugin/models/chart",["plugin/models/groups","plugin/library/deferred","mvc/visualization/visualization-model"],function(e,t){return Backbone.Model.extend({defaults:{id:null,title:"",type:"",date:null,state:"",state_info:"",modified:!1,dataset_id:"",dataset_id_job:""},initialize:function(n){this.groups=new e,this.settings=new Backbone.Model,this.deferred=new t},reset:function(){this.clear({silent:!0}).set(this.defaults),this.groups.reset(),this.settings.clear(),this.trigger("reset",this)},copy:function(e){var t=this;t.clear({silent:!0}).set(this.defaults),t.set(e.attributes),t.settings=e.settings.clone(),t.groups.reset(),e.groups.each(function(e){t.groups.add(e.clone())}),t.trigger("change",t)},state:function(e,t){this.set("state",e),this.set("state_info",t),this.trigger("set:state"),console.debug("Chart:state() - "+t+" ("+e+")")}})}),define("plugin/library/storage",["utils/utils","plugin/models/chart","plugin/models/group"],function(e,t,n){return Backbone.Model.extend({vis:null,initialize:function(e){this.app=e,this.chart=this.app.chart,this.options=this.app.options,this.id=this.options.id,this.vis=new Visualization({type:"charts",config:{dataset_id:this.options.config.dataset_id,chart_dict:{}}}),this.id&&(this.vis.id=this.id);var t=this.options.config.chart_dict;t&&(this.vis.get("config").chart_dict=t)},save:function(){var e=this.app.chart;this.vis.get("config").chart_dict={};var t=e.get("title");t!=""&&this.vis.set("title",t);var n={attributes:e.attributes,settings:e.settings.attributes,groups:[]};e.groups.each(function(e){n.groups.push(e.attributes)}),this.vis.get("config").chart_dict=n;var r=this;this.vis.save().fail(function(e,t,n){console.error(e,t,n)}).then(function(e){e&&e.id&&(r.id=e.id)})},load:function(){var e=this.vis.get("config").chart_dict;if(!e.attributes)return!1;this.chart.set(e.attributes),this.chart.state("ok","Loading saved visualization..."),this.chart.settings.set(e.settings);for(var t in e.groups)this.chart.groups.add(new n(e.groups[t]));return this.chart.set("modified",!1),!0}})}),define("plugin/views/viewport",["mvc/ui/ui-portlet","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,t){this.app=e,this.chart=this.app.chart,this.options=n.merge(t,this.optionsDefault),this.setElement($(this._template())),this._create_svg();var r=this;this.chart.on("redraw",function(){r._draw(r.chart)}),this.chart.on("set:state",function(){var e=r.$el.find("#info"),t=e.find("#icon");t.removeClass(),e.show(),e.find("#text").html(r.chart.get("state_info"));var n=r.chart.get("state");switch(n){case"ok":e.hide();break;case"failed":t.addClass("fa fa-warning");break;default:t.addClass("fa fa-spinner fa-spin")}})},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_create_svg:function(){this.svg&&this.svg.remove(),this.$el.append($(this._template_svg())),this.svg_el=this.$el.find("svg"),this.svg=d3.select(this.svg_el[0])},_draw:function(e){var t=this;this._create_svg(),e.state("wait","Please wait...");var n=e.deferred.register(),r=e.get("type"),i=this.app.types.get(r);if(!i.execute||i.execute&&e.get("modified"))this.app.jobs.cleanup(e),e.set("modified",!1);var t=this;require(["plugin/charts/"+r+"/"+r],function(r){var s=new r(t.app,{svg:t.svg});i.execute?e.get("dataset_id_job")==""?t.app.jobs.submit(e,t._defaultSettingsString(e),t._defaultRequestString(e),function(){s.draw(n,e,t._defaultRequestDictionary(e))},function(){e.deferred.done(n)}):s.draw(n,e,t._defaultRequestDictionary(e)):s.draw(n,e,t._defaultRequestDictionary(e))})},_defaultRequestString:function(e){var t=this.app.types.get(e.get("type")),n="",r=0;return e.groups.each(function(e){for(var i in t.columns)n+=i+"_"+ ++r+":"+(parseInt(e.get(i))+1)+", "}),n.substring(0,n.length-2)},_defaultSettingsString:function(e){var t="";for(key in e.settings.attributes)t+=key+":"+e.settings.get(key)+", ";return t.substring(0,t.length-2)},_defaultRequestDictionary:function(e){var t=this.app.types.get(e.get("type")),n={groups:[]};t.execute?n.id=e.get("dataset_id_job"):n.id=e.get("dataset_id");var r=0;return e.groups.each(function(e){var i={};for(var s in t.columns)i[s]=e.get(s);n.groups.push({key:++r+":"+e.get("key"),columns:i})}),n},_template:function(){return'<div style="height: 100%; min-height: 50px;"><div id="info" style="position: absolute; margin-left: 10px; margin-top: 10px; margin-bottom: 50px;"><span id="icon" style="font-size: 1.2em; display: inline-block;"/><span id="text" style="position: relative; margin-left: 5px; top: -1px; font-size: 1.0em;"/></div></div>'},_template_svg:function(){return'<svg style="height: calc(100% - 80px)"/>'}})}),define("plugin/views/viewer",["utils/utils","plugin/library/ui","mvc/ui/ui-portlet","plugin/models/group","plugin/views/viewport"],function(e,t,n,r,i){return Backbone.View.extend({initialize:function(e,r){this.app=e,this.chart=this.app.chart,this.viewport_view=new i(e);var s=this;this.portlet=new n.View({icon:"fa-bar-chart-o",title:"Viewport",operations:{edit_button:new t.ButtonIcon({icon:"fa-edit",tooltip:"Customize this chart",title:"Customize",onclick:function(){s._wait(s.chart,function(){s.app.go("editor")})}})}}),this.portlet.append(this.viewport_view.$el),this.setElement(this.portlet.$el);var s=this;this.chart.on("change:title",function(){s._refreshTitle()})},show:function(){this.$el.show(),$(window).trigger("resize")},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e)},_screenshot:function(){var e=new XMLSerializer,t=e.serializeToString(this.viewport_view.svg.node()),n="data:image/svg+xml;base64,"+btoa(t);window.location.href="data:application/x-download/;charset=utf-8,"+encodeURIComponent(t)},_wait:function(e,t){if(e.deferred.ready())t();else{var n=this;this.app.modal.show({title:"Please wait!",body:"Your chart is currently being processed. Please wait and try again.",buttons:{Close:function(){n.app.modal.hide()},Retry:function(){n.app.modal.hide(),setTimeout(function(){n._wait(e,t)},n.app.config.get("query_timeout"))}}})}}})}),define("mvc/ui/ui-tabs",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,list:{},$nav:null,$content:null,first_tab:null,optionsDefault:{title_new:"",operations:null,onnew:null},initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(this.options));this.$nav=n.find(".tab-navigation"),this.$content=n.find(".tab-content"),this.setElement(n),this.list={};var r=this;this.options.operations&&$.each(this.options.operations,function(e,t){t.$el.prop("id",e),r.$nav.find(".operations").append(t.$el)});if(this.options.onnew){var i=$(this._template_tab_new(this.options));this.$nav.append(i),i.tooltip({title:"Add a new tab",placement:"bottom",container:r.$el}),i.on("click",function(e){i.tooltip("hide"),r.options.onnew()})}},add:function(e){var t=e.id,n={$title:$(this._template_tab(e)),$content:$(this._template_tab_content(e)),removable:e.ondel?!0:!1};this.list[t]=n,this.options.onnew?this.$nav.find("#new-tab").before(n.$title):this.$nav.append(n.$title),n.$content.append(e.$el),this.$content.append(n.$content),_.size(this.list)==1&&(n.$title.addClass("active"),n.$content.addClass("active"),this.first_tab=t);if(e.ondel){var r=this,i=n.$title.find("#delete");i.tooltip({title:"Delete this tab",placement:"bottom",container:r.$el}),i.on("click",function(){return i.tooltip("destroy"),r.$el.find(".tooltip").remove(),e.ondel(),!1})}e.onclick&&n.$title.on("click",function(){e.onclick()})},del:function(e){var t=this.list[e];t.$title.remove(),t.$content.remove(),delete t,this.first_tab==e&&(this.first_tab=null),this.first_tab!=null&&this.show(this.first_tab)},delRemovable:function(){for(var e in this.list){var t=this.list[e];t.removable&&this.del(e)}},show:function(e){this.$el.fadeIn("fast"),this.visible=!0,e&&this.list[e].$title.find("a").tab("show")},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},hideOperation:function(e){this.$nav.find("#"+e).hide()},showOperation:function(e){this.$nav.find("#"+e).show()},setOperation:function(e,t){var n=this.$nav.find("#"+e);n.off("click"),n.on("click",t)},title:function(e,t){var n=this.list[e].$title.find("#text");return t&&n.html(t),n.html()},_template:function(e){return'<div class="tabbable tabs-left"><ul class="tab-navigation nav nav-tabs"><div class="operations" style="float: right; margin-bottom: 4px;"></div></ul><div class="tab-content"/></div>'},_template_tab_new:function(e){return'<li id="new-tab"><a href="javascript:void(0);"><i style="font-size: 0.8em; margin-right: 5px;" class="fa fa-plus-circle"/>'+e.title_new+"</a>"+"</li>"},_template_tab:function(e){var t='<li id="title-'+e.id+'">'+'<a title="" href="#tab-'+e.id+'" data-toggle="tab" data-original-title="">'+'<span id="text">'+e.title+"</span>";return e.ondel&&(t+='<i id="delete" style="font-size: 0.8em; margin-left: 5px; cursor: pointer;" class="fa fa-minus-circle"/>'),t+="</a></li>",t},_template_tab_content:function(e){return'<div id="tab-'+e.id+'" class="tab-pane"/>'}});return{View:t}}),define("plugin/library/ui-table",["utils/utils"],function(e){var t=Backbone.View.extend({row:null,row_count:0,optionsDefault:{content:"No content available.",onchange:null,ondblclick:null,onconfirm:null},events:{click:"_onclick",dblclick:"_ondblclick"},first:!0,initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(t));this.$thead=n.find("thead"),this.$tbody=n.find("tbody"),this.$tmessage=n.find("tmessage"),this.setElement(n),this.row=$("<tr></tr>")},addHeader:function(e){var t=$("<th></th>");t.append(e),this.row.append(t)},appendHeader:function(){this.$thead.append(this.row),this.row=$("<tr></tr>")},add:function(e,t){var n=$("<td></td>");t&&n.css("width",t),n.append(e),this.row.append(n)},append:function(e){this._commit(e)},prepend:function(e){this._commit(e,!0)},remove:function(e){var t=this.$tbody.find("#"+e);t.length>0&&(t.remove(),this.row_count--,this._refresh())},removeAll:function(){this.$tbody.html(""),this.row_count=0,this._refresh()},value:function(e){this.before=this.$tbody.find(".current").attr("id"),e!==undefined&&(this.$tbody.find("tr").removeClass("current"),e&&this.$tbody.find("#"+e).addClass("current"));var t=this.$tbody.find(".current").attr("id");return t===undefined?null:(t!=this.before&&this.options.onchange&&this.options.onchange(e),t)},size:function(){return this.$tbody.find("tr").length},_commit:function(e,t){this.remove(e),this.row.attr("id",e),t?this.$tbody.prepend(this.row):this.$tbody.append(this.row),this.row=$("<tr></tr>"),this.row_count++,this._refresh()},_onclick:function(e){var t=this.value(),n=$(e.target).closest("tr").attr("id");n&&t!=n&&(this.options.onconfirm?this.options.onconfirm(n):this.value(n))},_ondblclick:function(e){var t=this.value();t&&this.options.ondblclick&&this.options.ondblclick(t)},_refresh:function(){this.row_count==0?this.$tmessage.show():this.$tmessage.hide()},_template:function(e){return'<div><table class="grid"><thead></thead><tbody style="cursor: pointer;"></tbody></table><tmessage>'+e.content+"</tmessage>"+"<div>"}});return{View:t}}),define("plugin/views/group",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({columns:[],initialize:function(r,i){this.app=r;var s=this;this.chart=this.app.chart,this.group=i.group,this.group_key=new t.Input({placeholder:"Data label",onchange:function(){s.group.set("key",s.group_key.value())}}),this.table=new e.View({content:"No data column."});var o=$("<div/>");o.append(n.wrap((new t.Label({title:"Provide a label:"})).$el)),o.append(n.wrap(this.group_key.$el)),o.append(n.wrap((new t.Label({title:"Select columns:"})).$el)),o.append(n.wrap(this.table.$el)),this.setElement(o);var s=this;this.chart.on("change:dataset_id",function(){s._refreshTable()}),this.chart.on("change:type",function(){s._refreshTable()}),this.group.on("change:key",function(){s._refreshGroupKey()}),this.group.on("change",function(){s._refreshGroup()}),this._refreshTable(),this._refreshGroupKey(),this._refreshGroup()},_refreshTable:function(){var e=this.chart.get("dataset_id"),n=this.chart.get("type");if(!e||!n)return;var r=this,i=this.app.types.get(n);this.table.removeAll();var s={};for(var o in i.columns){var u=this.group.get(o);u||this.group.set(o,0);var a=i.columns[o],f=new t.Select.View({id:"select_"+o,gid:o,onchange:function(e){r.group.set(this.gid,e),r.chart.set("modified",!0)},value:u,wait:!0});this.table.add(a.title,"25%"),this.table.add(f.$el),this.table.append(o),s[o]=f}this.chart.state("wait","Loading metadata...");var l=this.chart.deferred.register();this.app.datasets.request({id:e},function(e){r.columns=[];var t=e.metadata_column_types;for(var n in t)(t[n]=="int"||t[n]=="float")&&r.columns.push({label:"Column: "+(parseInt(n)+1)+" ["+t[n]+"]",value:n});for(var n in s)s[n].update(r.columns),s[n].show();r.chart.state("wait","Metadata initialized..."),r.chart.deferred.done(l)})},_refreshGroup:function(){this.group.set("date",n.time())},_refreshGroupKey:function(){var e=this.group.get("key");e===undefined&&(e=""),this.group_key.value(e)}})}),define("plugin/library/ui-table-form",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){var r=Backbone.View.extend({list:[],initialize:function(r){this.table_title=new t.Label({title:r.title}),this.table=new e.View({content:r.content});var i=$("<div/>");i.append(n.wrap(this.table_title.$el)),i.append(n.wrap(this.table.$el)),this.setElement(i)},title:function(e){this.table_title.title(e)},update:function(e,t){this.table.removeAll(),this.list=[];for(var n in e)this._add(n,e[n],t);for(var n in this.list){var r=this.list[n].options.onchange;r&&r()}},_add:function(e,n,r){var i=this,s=null,o=n.type;switch(o){case"text":s=new t.Input({id:e,placeholder:n.placeholder,onchange:function(){r.set(e,s.value())}});break;case"select":s=new t.Select.View({id:e,data:n.data,onchange:function(){var t=s.value();r.set(e,t);var o=_.findWhere(n.data,{value:t});o&&(o.show&&i.$el.find("#"+o.show).fadeIn("fast"),o.hide&&i.$el.find("#"+o.hide).fadeOut("fast"))}});break;case"separator":s=$("<div/>");break;default:console.log("ui-table-form:_add","Unknown setting type ("+n.type+")");return}if(o!="separator"){r.get(e)||r.set(e,n.init),s.value(r.get(e)),this.list[e]=s;var u=$("<div/>");u.append(s.$el),u.append('<div class="toolParamHelp" style="font-size: 0.9em;">'+n.info+"</div>"),this.table.add('<span style="white-space: nowrap;">'+n.title+"</span>","25%"),this.table.add(u)}else this.table.add('<h6 style="white-space: nowrap;">'+n.title+":<h6/>"),this.table.add($("<div/>"));this.table.append(e)}});return{View:r}}),define("plugin/views/settings",["plugin/library/ui","plugin/library/ui-table-form","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,n){this.app=e;var r=this;this.chart=this.app.chart,this.form=new t.View({title:"Chart options:",content:"This chart type does not provide any options."}),this.setElement(this.form.$el);var r=this;this.chart.on("change",function(){r._refreshTable()})},_refreshTable:function(){var e=this.chart.get("type");if(!e)return;var t=this.app.types.get(e);this.form.title(t.title+":"),this.form.update(t.settings,this.chart.settings)}})}),define("plugin/views/editor",["mvc/ui/ui-tabs","plugin/library/ui-table","plugin/library/ui","mvc/ui/ui-portlet","utils/utils","plugin/models/chart","plugin/models/group","plugin/views/group","plugin/views/settings"],function(e,t,n,r,i,s,o,u,a){return Backbone.View.extend({optionsDefault:{header:!0,content:"No content available."},initialize:function(s,o){var u=this;this.app=s,this.chart=this.app.chart,this.options=i.merge(o,this.optionsDefault),this.portlet=new r.View({icon:"fa-bar-chart-o",title:"Editor",operations:{save:new n.ButtonIcon({icon:"fa-save",tooltip:"Draw Chart",title:"Draw",onclick:function(){u.app.go("viewer"),u._saveChart()}}),back:new n.ButtonIcon({icon:"fa-caret-left",tooltip:"Return to Viewer",title:"Return",onclick:function(){u.app.go("viewer"),u.app.storage.load()}})}}),this.table=new t.View({header:!1,onconfirm:function(e){u.chart.groups.length>0?u.app.modal.show({title:"Switching to another chart type?",body:"If you continue your settings and selections will be cleared.",buttons:{Cancel:function(){u.app.modal.hide()},Continue:function(){u.app.modal.hide(),u.table.value(e)}}}):u.table.value(e)},onchange:function(e){u.chart.groups.reset(),u.chart.settings.clear(),u.chart.set({type:e})},ondblclick:function(e){u.tabs.show("settings")},content:"No chart types available"});var f=0,l=s.types.attributes;for(var c in l){var h=l[c];this.table.add(++f+"."),h.execute?this.table.add(h.title+" (requires processing)"):this.table.add(h.title),this.table.append(c)}this.tabs=new e.View({title_new:"Add Data",onnew:function(){var e=u._addGroupModel();u.tabs.show(e.id)}}),this.title=new n.Input({placeholder:"Chart title",onchange:function(){u.chart.set("title",u.title.value())}});var p=$("<div/>");p.append(i.wrap((new n.Label({title:"Provide a chart title:"})).$el)),p.append(i.wrap(this.title.$el)),p.append(i.wrap((new n.Label({title:"Select a chart type:"})).$el)),p.append(i.wrap(this.table.$el)),this.tabs.add({id:"main",title:"Start",$el:p}),this.settings=new a(this.app),this.tabs.add({id:"settings",title:"Configuration",$el:this.settings.$el}),this.portlet.append(this.tabs.$el),this.setElement(this.portlet.$el),this.tabs.hideOperation("back");var u=this;this.chart.on("change:title",function(e){u._refreshTitle()}),this.chart.on("change:type",function(e){u.table.value(e.get("type"))}),this.chart.on("reset",function(e){u._resetChart()}),this.app.chart.on("redraw",function(e){u.portlet.showOperation("back")}),this.app.chart.groups.on("add",function(e){u._addGroup(e)}),this.app.chart.groups.on("remove",function(e){u._removeGroup(e)}),this.app.chart.groups.on("reset",function(e){u._removeAllGroups()}),this.app.chart.groups.on("change:key",function(e){u._refreshGroupKey()}),this._resetChart()},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e),this.title.value(e)},_refreshGroupKey:function(){var e=this,t=0;this.chart.groups.each(function(n){var r=n.get("key","");r==""&&(r="Chart data"),e.tabs.title(n.id,++t+": "+r)})},_addGroupModel:function(){var e=new o({id:i.uuid()});return this.chart.groups.add(e),e},_addGroup:function(e){var t=this,n=new u(this.app,{group:e}),r=t.chart.groups.length;this.tabs.add({id:e.id,$el:n.$el,ondel:function(){t.chart.groups.remove(e.id)}}),this._refreshGroupKey()},_removeGroup:function(e){this.tabs.del(e.id),this._refreshGroupKey(),this.chart.set("modified",!0)},_removeAllGroups:function(e){this.tabs.delRemovable()},_resetChart:function(){this.chart.set("id",i.uuid()),this.chart.set("type","bardiagram"),this.chart.set("dataset_id",this.app.options.config.dataset_id),this.chart.set("title","New Chart"),this.portlet.hideOperation("back")},_saveChart:function(){this.chart.set({type:this.table.value(),title:this.title.value(),date:i.time()}),this.chart.groups.length==0&&this._addGroupModel();var e=this;this.chart.deferred.execute(function(){e.app.storage.save(),e.chart.trigger("redraw")})}})}),define("plugin/models/config",[],function(){return Backbone.Model.extend({defaults:{query_limit:1e3,query_timeout:500}})}),define("plugin/charts/_nvd3/config",[],function(){return{title:"",columns:{y:{title:"Values for y-axis"}},settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},x_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:"x_axis_tick"},{label:"Auto",value:"auto",hide:"x_axis_tick"},{label:"Float",value:"f",show:"x_axis_tick"},{label:"Exponent",value:"e",show:"x_axis_tick"},{label:"Integer",value:"d",hide:"x_axis_tick"},{label:"Percentage",value:"p",show:"x_axis_tick"},{label:"Rounded",value:"r",show:"x_axis_tick"},{label:"SI-prefix",value:"s",show:"x_axis_tick"}]},x_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"},y_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:"y_axis_tick"},{label:"Auto",value:"auto",hide:"y_axis_tick"},{label:"Float",value:"f",show:"y_axis_tick"},{label:"Exponent",value:"e",show:"y_axis_tick"},{label:"Integer",value:"d",hide:"y_axis_tick"},{label:"Percentage",value:"p",show:"y_axis_tick"},{label:"Rounded",value:"r",show:"y_axis_tick"},{label:"SI-prefix",value:"s",show:"y_axis_tick"}]},y_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_legend:{title:"Others",type:"separator"},show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"select",init:"true",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}}}),define("plugin/charts/bardiagram/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Bar diagram"})}),define("plugin/charts/histogram/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Histogram",execute:!0,columns:{y:{title:"Observations"}},settings:{x_axis_label:{init:"Breaks"},y_axis_label:{init:"Density"}}})}),define("plugin/charts/horizontal/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Bar diagram (horizontal)",settings:{x_axis_type:{init:"hide"}}})}),define("plugin/charts/line/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Line chart"})}),define("plugin/charts/linewithfocus/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Line with focus"})}),define("plugin/charts/piechart/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Pie chart"})}),define("plugin/charts/scatterplot/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Scatter plot",columns:{x:{title:"Values for x-axis"}}})}),define("plugin/charts/stackedarea/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Stacked area"})}),define("plugin/charts/types",["plugin/charts/bardiagram/config","plugin/charts/histogram/config","plugin/charts/horizontal/config","plugin/charts/line/config","plugin/charts/linewithfocus/config","plugin/charts/piechart/config","plugin/charts/scatterplot/config","plugin/charts/stackedarea/config"],function(e,t,n,r,i,s,o,u){return Backbone.Model.extend({defaults:{bardiagram:e,horizontal:n,histogram:t,line:r,linewithfocus:i,piechart:s,scatterplot:o,stackedarea:u}})}),define("plugin/app",["mvc/ui/ui-modal","mvc/ui/ui-portlet","plugin/library/ui","utils/utils","plugin/library/jobs","plugin/library/datasets","plugin/library/storage","plugin/views/viewer","plugin/views/editor","plugin/models/config","plugin/models/chart","plugin/charts/types"],function(e,t,n,r,i,s,o,u,a,f,l,c){return Backbone.View.extend({initialize:function(t){this.options=t,Galaxy&&Galaxy.modal?this.modal=Galaxy.modal:this.modal=new e.View,this.config=new f,this.types=new c,this.chart=new l,this.jobs=new i(this),this.datasets=new s(this),this.storage=new o(this),this.viewer_view=new u(this),this.editor_view=new a(this),this.$el.append(this.viewer_view.$el),this.$el.append(this.editor_view.$el);if(!this.storage.load())this.go("editor");else{this.go("viewer");var n=this;this.chart.deferred.execute(function(){n.chart.trigger("redraw")})}},go:function(e){$(".tooltip").hide();switch(e){case"editor":this.editor_view.show(),this.viewer_view.hide();break;case"viewer":this.editor_view.hide(),this.viewer_view.show()}},execute:function(e){},onunload:function(){},log:function(e,t){console.log(e+" "+t)}})});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/_nvd3/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/_nvd3/config.js
@@ -0,0 +1,218 @@
+define([], function() {
+
+return {
+ title : '',
+ columns : {
+ y : {
+ title : 'Values for y-axis'
+ }
+ },
+ settings : {
+ separator_label : {
+ title : 'X axis',
+ type : 'separator'
+ },
+ x_axis_label : {
+ title : 'Axis label',
+ info : 'Provide a label for the axis.',
+ type : 'text',
+ init : 'X-axis',
+ placeholder : 'Axis label'
+ },
+ x_axis_type : {
+ title : 'Axis value type',
+ info : 'Select the value type of the axis.',
+ type : 'select',
+ init : 'auto',
+ data : [
+ {
+ label : '-- Do not show values --',
+ value : 'hide',
+ hide : 'x_axis_tick'
+ },
+ {
+ label : 'Auto',
+ value : 'auto',
+ hide : 'x_axis_tick'
+ },
+ {
+ label : 'Float',
+ value : 'f',
+ show : 'x_axis_tick'
+ },
+ {
+ label : 'Exponent',
+ value : 'e',
+ show : 'x_axis_tick'
+ },
+ {
+ label : 'Integer',
+ value : 'd',
+ hide : 'x_axis_tick'
+ },
+ {
+ label : 'Percentage',
+ value : 'p',
+ show : 'x_axis_tick'
+ },
+ {
+ label : 'Rounded',
+ value : 'r',
+ show : 'x_axis_tick'
+ },
+ {
+ label : 'SI-prefix',
+ value : 's',
+ show : 'x_axis_tick'
+ }
+ ]
+ },
+ x_axis_tick : {
+ title : 'Axis tick format',
+ info : 'Select the tick format for the axis.',
+ type : 'select',
+ init : '.1',
+ data : [
+ {
+ label : '0.00001',
+ value : '.5'
+ },
+ {
+ label : '0.0001',
+ value : '.4'
+ },
+ {
+ label : '0.001',
+ value : '.3'
+ },
+ {
+ label : '0.01',
+ value : '.2'
+ },
+ {
+ label : '0.1',
+ value : '.1'
+ },
+ {
+ label : '1',
+ value : '1'
+ }
+ ]
+
+ },
+ separator_tick : {
+ title : 'Y axis',
+ type : 'separator'
+ },
+ y_axis_label : {
+ title : 'Axis label',
+ info : 'Provide a label for the axis.',
+ type : 'text',
+ init : 'Y-axis',
+ placeholder : 'Axis label'
+ },
+ y_axis_type : {
+ title : 'Axis value type',
+ info : 'Select the value type of the axis.',
+ type : 'select',
+ init : 'auto',
+ data : [
+ {
+ label : '-- Do not show values --',
+ value : 'hide',
+ hide : 'y_axis_tick'
+ },
+ {
+ label : 'Auto',
+ value : 'auto',
+ hide : 'y_axis_tick'
+ },
+ {
+ label : 'Float',
+ value : 'f',
+ show : 'y_axis_tick'
+ },
+ {
+ label : 'Exponent',
+ value : 'e',
+ show : 'y_axis_tick'
+ },
+ {
+ label : 'Integer',
+ value : 'd',
+ hide : 'y_axis_tick'
+ },
+ {
+ label : 'Percentage',
+ value : 'p',
+ show : 'y_axis_tick'
+ },
+ {
+ label : 'Rounded',
+ value : 'r',
+ show : 'y_axis_tick'
+ },
+ {
+ label : 'SI-prefix',
+ value : 's',
+ show : 'y_axis_tick'
+ }
+ ]
+ },
+ y_axis_tick : {
+ title : 'Axis tick format',
+ info : 'Select the tick format for the axis.',
+ type : 'select',
+ init : '.1',
+ data : [
+ {
+ label : '0.00001',
+ value : '.5'
+ },
+ {
+ label : '0.0001',
+ value : '.4'
+ },
+ {
+ label : '0.001',
+ value : '.3'
+ },
+ {
+ label : '0.01',
+ value : '.2'
+ },
+ {
+ label : '0.1',
+ value : '.1'
+ },
+ {
+ label : '1',
+ value : '1'
+ }
+ ]
+
+ },
+ separator_legend : {
+ title : 'Others',
+ type : 'separator'
+ },
+ show_legend : {
+ title : 'Show legend',
+ info : 'Would you like to add a legend?',
+ type : 'select',
+ init : 'true',
+ data : [
+ {
+ label : 'Yes',
+ value : 'true'
+ },
+ {
+ label : 'No',
+ value : 'false'
+ }
+ ]
+ },
+ }
+};
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/_nvd3/nvd3.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/_nvd3/nvd3.js
@@ -0,0 +1,80 @@
+// dependencies
+define([], function() {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, nvd3_model, chart, request_dictionary, callback)
+ {
+ // request data
+ var self = this;
+ this.app.datasets.request(request_dictionary, function(data) {
+ nv.addGraph(function() {
+ // x axis
+ self._axis(nvd3_model.xAxis, chart.settings.get('x_axis_type'), chart.settings.get('x_axis_tick'));
+
+ // x axis label
+ nvd3_model.xAxis.axisLabel(chart.settings.get('x_axis_label'));
+
+ // y axis
+ self._axis(nvd3_model.yAxis, chart.settings.get('y_axis_type'), chart.settings.get('y_axis_tick'));
+
+ // y axis label
+ nvd3_model.yAxis.axisLabel(chart.settings.get('y_axis_label'))
+ .axisLabelDistance(30);
+
+ // controls
+ if (chart.groups.length == 1) {
+ nvd3_model.options({ showControls: false });
+ }
+
+ // legend
+ var legend_visible = true;
+ if (chart.settings.get('show_legend') == 'false') {
+ legend_visible = false;
+ }
+ nvd3_model.showLegend(legend_visible);
+
+ // custom callback
+ if (callback) {
+ callback(nvd3_model);
+ }
+
+ // parse data to svg
+ self.options.svg.datum(data)
+ .call(nvd3_model);
+
+ // refresh on window resize
+ nv.utils.windowResize(nvd3_model.update);
+
+ // set chart state
+ chart.state('ok', 'Chart has been drawn.');
+
+ // unregister process
+ chart.deferred.done(process_id);
+ });
+ });
+ },
+
+ // make axis
+ _axis: function(axis, type, tick) {
+ switch (type) {
+ case 'hide':
+ axis.tickFormat(function() { return '' });
+ break;
+ case 'auto':
+ break;
+ default:
+ axis.tickFormat(d3.format(tick + type));
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/bardiagram.js
--- a/config/plugins/visualizations/charts/static/charts/bardiagram.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// dependencies
-define([], function() {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.d3_chart = nv.models.multiBarChart();
-
- self.d3_chart.xAxis.tickFormat(d3.format('.2f'))
- self.d3_chart.yAxis.tickFormat(d3.format('.1f'))
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.d3_chart);
-
- nv.utils.windowResize(self.d3_chart.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/bardiagram/bardiagram.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/bardiagram/bardiagram.js
@@ -0,0 +1,21 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.multiBarChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/bardiagram/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/bardiagram/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Bar diagram',
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/histogram/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/histogram/config.js
@@ -0,0 +1,21 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Histogram',
+ execute : true,
+ columns : {
+ y : {
+ title : 'Observations'
+ }
+ },
+ settings : {
+ x_axis_label : {
+ init : 'Breaks'
+ },
+ y_axis_label : {
+ init : 'Density'
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/histogram/histogram.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/histogram/histogram.js
@@ -0,0 +1,31 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ // configure request
+ var index = 0;
+ for (var i in request_dictionary.groups) {
+ var group = request_dictionary.groups[i];
+ group.columns = {
+ x: index++,
+ y: index++
+ }
+ }
+
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.multiBarChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/horizontal.js
--- a/config/plugins/visualizations/charts/static/charts/horizontal.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.d3_chart = nv.models.multiBarHorizontalChart();
-
- self.d3_chart.xAxis.tickFormat(function() { return ''; });
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.d3_chart);
-
- nv.utils.windowResize(self.d3_chart.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/horizontal/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/horizontal/config.js
@@ -0,0 +1,12 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Bar diagram (horizontal)',
+ settings : {
+ x_axis_type : {
+ init : 'hide'
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/horizontal/horizontal.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/horizontal/horizontal.js
@@ -0,0 +1,21 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.multiBarHorizontalChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/line.js
--- a/config/plugins/visualizations/charts/static/charts/line.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.chart_3d = nv.models.lineChart();
-
- self.chart_3d.xAxis
- .tickFormat(d3.format(',f'));
-
- self.chart_3d.yAxis
- .tickFormat(d3.format(',.2f'));
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.chart_3d);
-
- nv.utils.windowResize(self.chart_3d.update);
-
- return self.chart_3d;
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/line/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/line/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Line chart',
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/line/line.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/line/line.js
@@ -0,0 +1,21 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.lineChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/linewithfocus.js
--- a/config/plugins/visualizations/charts/static/charts/linewithfocus.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.chart_3d = nv.models.lineWithFocusChart();
-
- self.chart_3d.xAxis
- .tickFormat(d3.format(',f'));
-
- self.chart_3d.yAxis
- .tickFormat(d3.format(',.2f'));
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.chart_3d);
-
- nv.utils.windowResize(self.chart_3d.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/linewithfocus/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/linewithfocus/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Line with focus',
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/linewithfocus/linewithfocus.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/linewithfocus/linewithfocus.js
@@ -0,0 +1,21 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.lineWithFocusChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/piechart.js
--- a/config/plugins/visualizations/charts/static/charts/piechart.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // loop through data groups
- for (var key in data) {
- // get group
- var group = data[key];
-
- // format chart data
- var pie_data = [];
- for (var key in group.values) {
- var value = group.values[key];
- pie_data.push ({
- key : value.x,
- y : value.y
- });
- }
-
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.chart_3d = nv.models.pieChart()
- .donut(true)
- .showLegend(false);
-
- d3.select(self.options.svg_id)
- .datum(pie_data)
- .call(self.chart_3d);
-
- nv.utils.windowResize(self.chart_3d.update);
-
- return self.chart_3d;
- });
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/piechart/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/piechart/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Pie chart',
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/piechart/piechart.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/piechart/piechart.js
@@ -0,0 +1,57 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ // request data
+ var self = this;
+ this.app.datasets.request(request_dictionary, function(data) {
+
+ // loop through data groups
+ for (var key in request_dictionary.groups) {
+ // get group
+ var group = request_dictionary.groups[key];
+
+ // format chart data
+ var pie_data = [];
+ for (var key in group.values) {
+ var value = group.values[key];
+ pie_data.push ({
+ key : value.x,
+ y : value.y
+ });
+ }
+
+ // add graph to screen
+ nv.addGraph(function() {
+ self.chart_3d = nv.models.pieChart()
+ .donut(true)
+ .showLegend(false);
+
+ self.options.svg.datum(pie_data)
+ .call(self.chart_3d);
+
+ nv.utils.windowResize(self.chart_3d.update);
+
+ // set chart state
+ chart.state('ok', 'Pie chart drawn.');
+
+ // unregister process
+ chart.deferred.done(process_id);
+ });
+ }
+ });
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/scatterplot.js
--- a/config/plugins/visualizations/charts/static/charts/scatterplot.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.d3_chart = nv.models.scatterChart()
- .showDistX(true)
- .showDistY(true)
- .color(d3.scale.category10().range());
-
- self.d3_chart.xAxis.tickFormat(d3.format('.02f'))
- self.d3_chart.yAxis.tickFormat(d3.format('.02f'))
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.d3_chart);
-
- nv.utils.windowResize(self.d3_chart.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/scatterplot/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/scatterplot/config.js
@@ -0,0 +1,12 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Scatter plot',
+ columns : {
+ x : {
+ title : 'Values for x-axis'
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/scatterplot/scatterplot.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/scatterplot/scatterplot.js
@@ -0,0 +1,25 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.scatterChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3_model.showDistX(true)
+ .showDistY(true)
+ .color(d3.scale.category10().range());
+ });
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/stackedarea.js
--- a/config/plugins/visualizations/charts/static/charts/stackedarea.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- // check data
- var valid = true;
- var length = 0;
- for (var key in data) {
- // evalute length
- if (length == 0) {
- length = data[key].values.length;
- } else {
- if (length != data[key].values.length) {
- valid = false;
- break;
- }
- }
- }
- if (!valid) {
- return;
- }
-
- // make plot
- self.d3_chart = nv.models.stackedAreaChart()
- .x(function(d) {
- return d.x
- })
- .y(function(d) {
- return d.y
- })
- .clipEdge(true);
-
- self.d3_chart.xAxis.tickFormat(function() { return ''; });
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.d3_chart);
-
- nv.utils.windowResize(self.d3_chart.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/stackedarea/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/stackedarea/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Stacked area'
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/stackedarea/stackedarea.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/stackedarea/stackedarea.js
@@ -0,0 +1,26 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.stackedAreaChart(), chart, request_dictionary, function(nvd3_model) {
+ // make plot
+ nvd3_model.x(function(d) { return d.x })
+ .y(function(d) { return d.y })
+ .clipEdge(true);
+ });
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/types.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/types.js
@@ -0,0 +1,39 @@
+// dependencies
+define(['plugin/charts/bardiagram/config',
+ //'plugin/charts/boxplot/config',
+ 'plugin/charts/histogram/config',
+ 'plugin/charts/horizontal/config',
+ 'plugin/charts/line/config',
+ 'plugin/charts/linewithfocus/config',
+ 'plugin/charts/piechart/config',
+ 'plugin/charts/scatterplot/config',
+ 'plugin/charts/stackedarea/config',
+ ], function(bardiagram,
+ //boxplot,
+ histogram,
+ horizontal,
+ line,
+ linewithfocus,
+ piechart,
+ scatterplot,
+ stackedarea
+ ) {
+
+// widget
+return Backbone.Model.extend(
+{
+ // types
+ defaults: {
+ 'bardiagram' : bardiagram,
+ //'boxplot' : boxplot,
+ 'horizontal' : horizontal,
+ 'histogram' : histogram,
+ 'line' : line,
+ 'linewithfocus' : linewithfocus,
+ 'piechart' : piechart,
+ 'scatterplot' : scatterplot,
+ 'stackedarea' : stackedarea
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/library/datasets.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/library/datasets.js
@@ -0,0 +1,149 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// widget
+return Backbone.Collection.extend(
+{
+ // list of datasets
+ list: {},
+
+ // initialize
+ initialize: function(app, options)
+ {
+ // link app
+ this.app = app;
+
+ // configure options
+ this.options = Utils.merge(options, this.optionsDefault);
+ },
+
+ // wait
+ request: function(options, success, error) {
+ // link this
+ var self = this;
+
+ // check if column data is requested
+ if (options.groups) {
+ this._fetch(options, success);
+ } else {
+ // check if dataset is available from cache
+ var dataset = this.list[options.id];
+ if (dataset) {
+ success(dataset);
+ return;
+ }
+
+ // request dataset
+ Utils.request('GET', config.root + 'api/datasets/' + options.id, {}, function(dataset) {
+ switch (dataset.state) {
+ case 'error':
+ if (error) {
+ error(dataset);
+ }
+ break;
+ default:
+ self.list[options.id] = dataset;
+ success(dataset);
+ }
+ });
+ }
+ },
+
+ // fetch data columns into dataset object
+ _fetch: function(options, callback) {
+ // set offset
+ var offset = options.start ? options.start : 0;
+
+ // set limit
+ var limit = Math.abs(options.end - options.start);
+ var query_limit = this.app.config.get('query_limit');
+ if (!limit || limit > query_limit) {
+ limit = query_limit;
+ }
+
+ // get column indices
+ var index_string = '';
+ var index_map = {};
+ var index_count = 0;
+ for (var i in options.groups) {
+ var group = options.groups[i];
+ for (var key in group.columns) {
+ var column = group.columns[key];
+
+ // add to index string
+ index_string += column + ',';
+
+ // add to dictionary
+ index_map[column] = index_count;
+
+ // increase counter
+ index_count++;
+ }
+ }
+ if (index_count == 0) {
+ callback({});
+ return;
+ }
+ index_string = index_string.substring(0, index_string.length - 1);
+
+ // initialize result dictionary
+ var result = options.groups.slice(0);
+ for (var i in result) {
+ result[i].values = [];
+ }
+
+ // make request
+ var self = this;
+ Utils.request('GET', config.root + 'api/datasets/' + options.id, {
+ data_type : 'raw_data',
+ provider : 'dataset-column',
+ limit : limit,
+ offset : offset,
+ indeces : index_string
+ }, function(response) {
+
+ // loop through rows
+ for (var i in response.data) {
+ // get row
+ var row = response.data[i];
+
+ // collect all data into the defined groups
+ for (var j in options.groups) {
+ // get group
+ var group = options.groups[j];
+
+ // initialize value
+ var value = {
+ x : parseInt(i) + offset
+ };
+
+ // fill value
+ for (var key in group.columns) {
+ // get column
+ var column = group.columns[key];
+
+ // identify column
+ var index = index_map[column];
+
+ // read value from row
+ var v = row[index];
+ if(isNaN(v) || !v) {
+ v = 0;
+ }
+
+ // add value to dictionary
+ value[key] = v;
+ }
+
+ // add to result
+ result[j].values.push(value);
+ }
+ }
+
+ // callback
+ callback(result);
+ });
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/library/deferred.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/library/deferred.js
@@ -0,0 +1,85 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// deferred process handler
+return Backbone.Model.extend(
+{
+ // queue
+ queue: [],
+
+ // list of currently registered processes
+ process: {},
+
+ // process counter
+ counter: 0,
+
+ // initialize
+ initialize: function()
+ {
+ // loop through queue and check states
+ this.on('refresh', function() {
+ if (this.counter == 0) {
+ for (var index in this.queue) {
+ // execute callback
+ this.queue[index]();
+
+ // remove callback
+ this.queue.splice(index, 1);
+ }
+ }
+ });
+ },
+
+ // executes callback once all processes are unregistered
+ execute: function(callback) {
+ // add wrapper to queue
+ this.queue.push(callback);
+
+ // trigger change
+ this.trigger('refresh');
+ },
+
+ // register process
+ register: function() {
+ // create unique id
+ var id = Utils.uuid();
+
+ // add process to queue
+ this.process[id] = true;
+
+ // increase process counter
+ this.counter++;
+
+ // log
+ console.debug('Deferred:register() - Registering ' + id);
+
+ // return unique id
+ return id;
+ },
+
+ // unregister process
+ done: function(id) {
+ // delete tag
+ delete this.process[id];
+
+ // decrease process counter
+ this.counter--;
+
+ // log
+ console.debug('Deferred:done() - Unregistering ' + id);
+
+ // trigger change
+ this.trigger('refresh');
+ },
+
+ // ready
+ ready: function() {
+ if (this.counter == 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/library/jobs.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/library/jobs.js
@@ -0,0 +1,152 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// widget
+return Backbone.Model.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ // link app
+ this.app = app;
+
+ // link options
+ this.options = Utils.merge(options, this.optionsDefault);
+ },
+
+ // clean
+ cleanup: function(chart) {
+ // cleanup previous dataset file
+ var previous = chart.get('dataset_id_job');
+ if (previous != '') {
+ var self = this;
+ Utils.request('PUT', config.root + 'api/histories/none/contents/' + previous, { deleted: true }, function() {
+ // update galaxy history
+ self._refreshHdas();
+ });
+
+ // reset id
+ chart.set('dataset_id_job', '');
+ }
+ },
+
+ // create job
+ submit: function(chart, settings_string, columns_string, success, error) {
+ // link this
+ var self = this;
+
+ // backup chart details
+ var chart_id = chart.id;
+ var chart_type = chart.get('type');
+
+ // get chart settings
+ var chart_settings = this.app.types.get(chart_type);
+
+ // configure tool
+ data = {
+ 'tool_id' : 'chartskit',
+ 'inputs' : {
+ 'input' : {
+ 'id' : chart.get('dataset_id'),
+ 'src' : 'hda'
+ },
+ 'module' : chart_type,
+ 'columns' : columns_string,
+ 'settings' : settings_string
+ }
+ }
+
+ // set chart state
+ chart.state('wait', 'Sending job request...');
+
+ // post job
+ Utils.request('POST', config.root + 'api/tools', data,
+ // success handler
+ function(response) {
+ if (!response.outputs || response.outputs.length == 0) {
+ chart.state('failed', 'Job submission failed. No response.');
+
+ // call error
+ error && error();
+ } else {
+ // update galaxy history
+ self._refreshHdas();
+
+ // get dataset
+ var job = response.outputs[0];
+
+ // check dataset
+ chart.state('wait', 'Job has been queued...');
+
+ // backup resulting dataset id
+ chart.set('dataset_id_job', job.id);
+
+ // save
+ this.app.storage.save();
+
+ // wait for job completion
+ self._loop(job.id, function(job) {
+ switch (job.state) {
+ case 'ok':
+ // update state
+ chart.state('wait', 'Job completed successfully...');
+
+ // execute success
+ success(job);
+
+ // stop loop
+ return true;
+ case 'error':
+ // update state
+ chart.state('failed', 'Job has failed. Please check the history for details.');
+
+ // call error
+ error && error();
+
+ // stop loop
+ return true;
+ case 'running':
+ // wait
+ chart.state('wait', 'Job is running...');
+
+ // continue loop
+ return false;
+ }
+ });
+ }
+ },
+ // error handler
+ function(response) {
+ var message = '';
+ if (response && response.message && response.message.data && response.message.data.input) {
+ message = response.message.data.input + '.';
+ }
+ // update state
+ chart.state('failed', 'This visualization requires the Charts-Kit. Please make sure it is installed. ' + message);
+
+ // call error
+ error && error();
+
+ }
+ );
+ },
+
+ // request job details
+ _loop: function(id, callback) {
+ var self = this;
+ Utils.request('GET', config.root + 'api/datasets/' + id, {}, function(job) {
+ if (!callback(job)) {
+ setTimeout(function() { self._loop(id, callback); }, self.app.config.get('query_timeout'));
+ }
+ });
+ },
+
+ // refresh history panel
+ _refreshHdas: function() {
+ // update galaxy history
+ if (Galaxy && Galaxy.currHistoryPanel) {
+ Galaxy.currHistoryPanel.refreshHdas();
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/library/portlet.js
--- a/config/plugins/visualizations/charts/static/library/portlet.js
+++ /dev/null
@@ -1,171 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// return
-return Backbone.View.extend(
-{
- // visibility
- visible: false,
-
- // defaults options
- optionsDefault: {
- label : '',
- icon : 'fa-tasks',
- buttons : null,
- body : null,
- height : null,
- operations : null,
- placement : 'bottom',
- overflow : 'auto'
- },
-
- // content
- $content : null,
-
- // initialize
- initialize : function(options) {
- // configure options
- this.options = Utils.merge(options, this.optionsDefault);
-
- // create new element
- this.setElement(this.template(this.options));
-
- // link content
- this.$content = this.$el.find('#content');
-
- // set content height
- if (this.options.height) {
- this.$el.find('#body').css('height', this.options.height);
- this.$el.find('#content').css('overflow', this.options.overflow);
- }
-
- // append buttons
- this.$buttons = $(this.el).find('#buttons');
- if (this.options.buttons) {
- // link functions
- var self = this;
- $.each(this.options.buttons, function(name, item) {
- item.$el.prop('id', name);
- self.$buttons.append(item.$el);
- });
- } else {
- this.$buttons.remove();
- }
-
- // append operations
- this.$operations = $(this.el).find('#operations');
- if (this.options.operations) {
- // link functions
- var self = this;
- $.each(this.options.operations, function(name, item) {
- item.$el.prop('id', name);
- self.$operations.append(item.$el);
- });
- }
-
- // add body
- if(this.options.body) {
- this.append(this.options.body);
- }
- },
-
- // append
- append: function($el) {
- this.$content.append(Utils.wrap($el));
- },
-
- // content
- content: function() {
- return this.$content;
- },
-
- // hide modal
- show: function(){
- // fade in
- this.$el.fadeIn('fast');
-
- // set flag
- this.visible = true;
- },
-
- // hide modal
- hide: function(){
- // fade out
- this.$el.fadeOut('fast');
-
- // set flag
- this.visible = false;
- },
-
- // enable buttons
- enableButton: function(id) {
- this.$buttons.find('#' + id).prop('disabled', false);
- },
-
- // disable buttons
- disableButton: function(id) {
- this.$buttons.find('#' + id).prop('disabled', true);
- },
-
- // enable operation
- hideOperation: function(id) {
- this.$operations.find('#' + id).hide();
- },
-
- // disable operation
- showOperation: function(id) {
- this.$operations.find('#' + id).show();
- },
-
- // set operation
- setOperation: function(id, callback) {
- var $el = this.$operations.find('#' + id);
- $el.off('click');
- $el.on('click', callback);
- },
-
- // label
- label: function(new_label) {
- var $el = this.$el.find('#label');
- if (new_label) {
- $el.html(new_label);
- }
- return $el.html();
- },
-
- // fill regular modal template
- template: function(options) {
- var tmpl = '<div class="toolForm">';
-
- if (options.label || options.icon) {
- tmpl += '<div id="title" class="toolFormTitle" style="overflow:hidden;">' +
- '<div id="operations" style="float: right;"></div>' +
- '<div style="overflow: hidden">';
-
- if (options.icon)
- tmpl += '<i style="padding-top: 3px; float: left; font-size: 1.2em" class="icon fa ' + options.icon + '"> </i>';
-
- tmpl += '<div id="label" style="padding-top: 2px; float: left;">' + options.label + '</div>';
-
- tmpl += '</div>' +
- '</div>';
- }
- tmpl += '<div id="body" class="toolFormBody">';
-
- if (options.placement == 'top') {
- tmpl += '<div id="buttons" class="buttons" style="height: 50px; padding: 10px;"></div>';
- }
-
- tmpl += '<div id="content" class="content" style="height: inherit; padding: 10px;"></div>';
-
- if (options.placement == 'bottom') {
- tmpl += '<div id="buttons" class="buttons" style="height: 50px; padding: 10px;"></div>';
- }
-
- tmpl += '</div>' +
- '</div>';
- return tmpl;
- }
-});
-
-});
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/galaxy/galaxy-central/commits/1ad62c772728/
Changeset: 1ad62c772728
Branch: stable
User: natefoo
Date: 2014-04-15 01:28:10
Summary: Added tag release_2014.04.14 for changeset 9e53251b0b7e
Affected #: 1 file
diff -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc -r 1ad62c7727285084e46ee3572835483e34c551a5 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -6,3 +6,4 @@
1ae95b3aa98d1ccf15b243ac3ce6a895eb7efc53 release_2013.08.12
26f58e05aa1068761660681583821e21e6cbf7ab release_2013.11.04
5e605ed6069fe4c5ca9875e95e91b2713499e8ca release_2014.02.10
+9e53251b0b7e93b9563008a2b112f2e815a04bbc release_2014.04.14
https://bitbucket.org/galaxy/galaxy-central/commits/3b3365a39194/
Changeset: 3b3365a39194
User: natefoo
Date: 2014-04-15 01:28:45
Summary: Merge stable to default
Affected #: 1 file
diff -r 855b03513ca92f33be6d4da54afffadad294a9cc -r 3b3365a391944f848b403412f226ee9e5499c0d5 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -6,3 +6,4 @@
1ae95b3aa98d1ccf15b243ac3ce6a895eb7efc53 release_2013.08.12
26f58e05aa1068761660681583821e21e6cbf7ab release_2013.11.04
5e605ed6069fe4c5ca9875e95e91b2713499e8ca release_2014.02.10
+9e53251b0b7e93b9563008a2b112f2e815a04bbc release_2014.04.14
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Merged in hillrunner2008/galaxy-central (pull request #367)
by commits-noreply@bitbucket.org 14 Apr '14
by commits-noreply@bitbucket.org 14 Apr '14
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/855b03513ca9/
Changeset: 855b03513ca9
User: dan
Date: 2014-04-14 22:56:48
Summary: Merged in hillrunner2008/galaxy-central (pull request #367)
added support for the visualization of gtf file format in IGB
Affected #: 2 files
diff -r c2a2ce95501c9e1a3da2550ce963376a49449481 -r 855b03513ca92f33be6d4da54afffadad294a9cc datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -99,6 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r c2a2ce95501c9e1a3da2550ce963376a49449481 -r 855b03513ca92f33be6d4da54afffadad294a9cc display_applications/igb/gtf.xml
--- /dev/null
+++ b/display_applications/igb/gtf.xml
@@ -0,0 +1,17 @@
+<display id="igb_gtf" version="1.0.0" name="display in IGB">
+
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link>
+</display>
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/56dee1c67384/
Changeset: 56dee1c67384
User: dcnorris
Date: 2014-04-14 16:05:03
Summary: adding support for the visualization of gtf file format in IGB
Affected #: 2 files
diff -r 6ae3b10ec63e21b0df60f9428ab312ecad0e4e62 -r 56dee1c67384211bf4844a2798bf89dfb2e8cff8 datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -99,6 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r 6ae3b10ec63e21b0df60f9428ab312ecad0e4e62 -r 56dee1c67384211bf4844a2798bf89dfb2e8cff8 display_applications/igb/gtf.xml
--- /dev/null
+++ b/display_applications/igb/gtf.xml
@@ -0,0 +1,17 @@
+<display id="igb_gtf" version="1.0.0" name="display in IGB">
+
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link>
+</display>
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/fe0335898665/
Changeset: fe0335898665
User: dcnorris
Date: 2014-04-14 22:43:49
Summary: converted tabs to spaces
Affected #: 2 files
diff -r 56dee1c67384211bf4844a2798bf89dfb2e8cff8 -r fe03358986651d3e4bac287cd69e77a925d05cb3 datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -99,7 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
- <display file="igb/gtf.xml" />
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r 56dee1c67384211bf4844a2798bf89dfb2e8cff8 -r fe03358986651d3e4bac287cd69e77a925d05cb3 display_applications/igb/gtf.xml
--- a/display_applications/igb/gtf.xml
+++ b/display_applications/igb/gtf.xml
@@ -1,17 +1,17 @@
<display id="igb_gtf" version="1.0.0" name="display in IGB">
- <link id="View" name="View">
- <url>$bioviz</url>
- <param type="data" name="gtf_file_for_name" viewable="False"/>
- <param type="template" name="niceName" viewable="False" strip="True">
- #import re
- #set nm=$gtf_file_for_name.name
- ${re.sub('\W',"_",nm)}
- </param>
- <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
-
- <param type="template" name="bioviz" strip="True" >
- http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
</param>
- </link>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link></display>
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/855b03513ca9/
Changeset: 855b03513ca9
User: dan
Date: 2014-04-14 22:56:48
Summary: Merged in hillrunner2008/galaxy-central (pull request #367)
added support for the visualization of gtf file format in IGB
Affected #: 2 files
diff -r c2a2ce95501c9e1a3da2550ce963376a49449481 -r 855b03513ca92f33be6d4da54afffadad294a9cc datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -99,6 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r c2a2ce95501c9e1a3da2550ce963376a49449481 -r 855b03513ca92f33be6d4da54afffadad294a9cc display_applications/igb/gtf.xml
--- /dev/null
+++ b/display_applications/igb/gtf.xml
@@ -0,0 +1,17 @@
+<display id="igb_gtf" version="1.0.0" name="display in IGB">
+
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link>
+</display>
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c2a2ce95501c/
Changeset: c2a2ce95501c
User: dan
Date: 2014-04-14 22:34:16
Summary: merge next stable
Affected #: 1 file
diff -r 12265c0cca1f20c5c87c909a4e6faaff089c70ee -r c2a2ce95501c9e1a3da2550ce963376a49449481 universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -708,14 +708,6 @@
# Enable enforcement of quotas. Quotas can be set from the Admin interface.
#enable_quotas = False
-# Enable a feature when running workflows. When enabled, default datasets
-# are selected for "Set at Runtime" inputs from the history such that the
-# same input will not be selected twice, unless there are more inputs than
-# compatible datasets in the history.
-# When False, the most recently added compatible item in the history will
-# be used for each "Set at Runtime" input, independent of others in the Workflow
-#enable_unique_workflow_defaults = False
-
# This option allows users to see the full path of datasets via the "View
# Details" option in the history. Administrators can always see this.
#expose_dataset_path = False
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Remove duplicated enable_unique_workflow_defaults from universe_wsgi.ini.sample.
by commits-noreply@bitbucket.org 14 Apr '14
by commits-noreply@bitbucket.org 14 Apr '14
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1165a5a1221a/
Changeset: 1165a5a1221a
Branch: next-stable
User: dan
Date: 2014-04-14 22:33:57
Summary: Remove duplicated enable_unique_workflow_defaults from universe_wsgi.ini.sample.
Affected #: 1 file
diff -r 52f8e109315ae84a36999586d333e1758511477f -r 1165a5a1221ac538bcbfd4e046a33e5bbfb1106a universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -708,14 +708,6 @@
# Enable enforcement of quotas. Quotas can be set from the Admin interface.
#enable_quotas = False
-# Enable a feature when running workflows. When enabled, default datasets
-# are selected for "Set at Runtime" inputs from the history such that the
-# same input will not be selected twice, unless there are more inputs than
-# compatible datasets in the history.
-# When False, the most recently added compatible item in the history will
-# be used for each "Set at Runtime" input, independent of others in the Workflow
-#enable_unique_workflow_defaults = False
-
# This option allows users to see the full path of datasets via the "View
# Details" option in the history. Administrators can always see this.
#expose_dataset_path = False
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/12265c0cca1f/
Changeset: 12265c0cca1f
User: dan
Date: 2014-04-14 22:30:29
Summary: merge next stable
Affected #: 1 file
diff -r a48baeee4ff4014ea42a65adc73f3e5f6184f9a4 -r 12265c0cca1f20c5c87c909a4e6faaff089c70ee lib/galaxy/webapps/galaxy/controllers/tool_runner.py
--- a/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
@@ -192,7 +192,12 @@
#This needs to be done recursively through grouping parameters
def rerun_callback( input, value, prefixed_name, prefixed_label ):
if isinstance( value, UnvalidatedValue ):
- return str( value )
+ try:
+ return input.to_html_value( value.value, trans.app )
+ except Exception, e:
+ # Need to determine when (if ever) the to_html_value call could fail.
+ log.debug( "Failed to use input.to_html_value to determine value of unvalidated parameter, defaulting to string: %s" % ( e ) )
+ return str( value )
if isinstance( input, DataToolParameter ):
if isinstance(value,list):
values = []
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Fix for rerun of unvalidated parameters for multiple selects.
by commits-noreply@bitbucket.org 14 Apr '14
by commits-noreply@bitbucket.org 14 Apr '14
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/52f8e109315a/
Changeset: 52f8e109315a
Branch: next-stable
User: dan
Date: 2014-04-14 22:29:46
Summary: Fix for rerun of unvalidated parameters for multiple selects.
Affected #: 1 file
diff -r 8d4ceccae2367e06bc05f93bfdc51119a962307b -r 52f8e109315ae84a36999586d333e1758511477f lib/galaxy/webapps/galaxy/controllers/tool_runner.py
--- a/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
@@ -192,7 +192,12 @@
#This needs to be done recursively through grouping parameters
def rerun_callback( input, value, prefixed_name, prefixed_label ):
if isinstance( value, UnvalidatedValue ):
- return str( value )
+ try:
+ return input.to_html_value( value.value, trans.app )
+ except Exception, e:
+ # Need to determine when (if ever) the to_html_value call could fail.
+ log.debug( "Failed to use input.to_html_value to determine value of unvalidated parameter, defaulting to string: %s" % ( e ) )
+ return str( value )
if isinstance( input, DataToolParameter ):
if isinstance(value,list):
values = []
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a48baeee4ff4/
Changeset: a48baeee4ff4
User: dan
Date: 2014-04-14 21:47:01
Summary: merge next-stable
Affected #: 2 files
diff -r eebf1cdecd19c748046526cb5351604b38332e01 -r a48baeee4ff4014ea42a65adc73f3e5f6184f9a4 lib/galaxy/tools/parameters/__init__.py
--- a/lib/galaxy/tools/parameters/__init__.py
+++ b/lib/galaxy/tools/parameters/__init__.py
@@ -53,16 +53,18 @@
value = incoming_value
error = None
try:
- if value is not None or isinstance(param, DataToolParameter):
+ if value is not None or isinstance( param, DataToolParameter ):
# Convert value from HTML representation
if source == 'html':
value = param.from_html( value, trans, param_values )
else:
value = param.from_json( value, trans, param_values )
- # Allow the value to be converted if neccesary
- filtered_value = param.filter_value( value, trans, param_values )
- # Then do any further validation on the value
- param.validate( filtered_value, trans.history )
+ # Only validate if late validation is not needed
+ if not param.need_late_validation( trans, param_values ):
+ # Allow the value to be converted if necessary
+ filtered_value = param.filter_value( value, trans, param_values )
+ # Then do any further validation on the value
+ param.validate( filtered_value, trans.history )
elif value is None and isinstance( param, SelectToolParameter ):
# An empty select list or column list
param.validate( value, trans.history )
diff -r eebf1cdecd19c748046526cb5351604b38332e01 -r a48baeee4ff4014ea42a65adc73f3e5f6184f9a4 lib/galaxy/tools/parameters/basic.py
--- a/lib/galaxy/tools/parameters/basic.py
+++ b/lib/galaxy/tools/parameters/basic.py
@@ -183,6 +183,9 @@
for validator in self.validators:
validator.validate( value, history )
+ def need_late_validation( self, trans, context ):
+ return False
+
def to_dict( self, trans, view='collection', value_mapper=None ):
""" to_dict tool parameter. This can be overridden by subclasses. """
tool_dict = super( ToolParameter, self ).to_dict()
@@ -1774,6 +1777,11 @@
else:
validator.validate( value, history )
+ def need_late_validation( self, trans, context ):
+ if trans is None or trans.workflow_building_mode:
+ return True
+ return False
+
def get_dependencies( self ):
"""
Get the *names* of the other params this param depends on.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0