Rehab Budget Tool
Build a room-by-room scope-of-work budget for your SFR project. Your finished budget exports in the exact Ternus draw format.
Running total
$0
Cost ranges shown are national planning estimates adjusted for your state — verify all costs with your contractors. This tool provides planning estimates only. It is not a bid, appraisal, loan approval, or feasibility determination. Any financing is subject to underwriting and final approval.
Got it. We’re on it.
Your budget files are ready below. We also email you an edit link so you can update this budget any time.
Excel (draw format)
CSV
PDF
Copy edit link
Keep editing
Done — continue
All exports carry the estimates disclaimer. Figures are user-entered planning estimates only — not a bid, appraisal, or feasibility determination.
InVzZSBzdHJpY3QiOwp2YXIgVFJCVCA9IChmdW5jdGlvbigpewoKLyogPT09PT09PT09PT09PT09PT0gREVQTE9ZTUVOVCBDT05GSUcgKHNlZSBEZXBsb3ltZW50IFJ1bmJvb2spID09PT09PT09PT09PT09PT09CiAgIEZvcm0gMjYgPSBleGlzdGluZyB0ZXJudXMu
Y29tIGNvbnRhY3QgZm9ybSAoZmllbGRzIHZlcmlmaWVkIEp1bHkgNywgMjAyNikuCiAgIHN1bW1hcnkgLyBlZGl0TGluayBzdGF5IG51bGwgdW50aWwgdGhlIHR3byBoaWRkZW4gZmllbGRzIGFyZSBhZGRlZCBpbgogICB3cC1hZG1pbiAocnVuYm9vayBzdGVwIDEp
IFx1MjAxNCB0aGUgdG9vbCB3b3JrcyB3aXRob3V0IHRoZW0sIGJ1dCB0aGUgZW1haWxlZAogICBlZGl0IGxpbmsgYW5kIGJ1ZGdldCBzdW1tYXJ5IHJlcXVpcmUgdGhlbS4gKi8KdmFyIENPTkZJRyA9IHsKICBHRl9FTkRQT0lOVDogImh0dHBzOi8vd3d3LnRlcm51
cy5jb20vd3AtanNvbi9nZi92Mi9mb3Jtcy8yOC9zdWJtaXNzaW9ucyIsCiAgRklFTERTOiB7CiAgICBmaXJzdDogImlucHV0XzNfMyIsCiAgICBsYXN0OiAiaW5wdXRfM182IiwKICAgIGVtYWlsOiAiaW5wdXRfNiIsCiAgICBwaG9uZTogImlucHV0XzciLAogICAg
c21zQ29uc2VudDogImlucHV0XzhfMSIsCiAgICBlbWFpbENvbnNlbnQ6ICJpbnB1dF85XzEiLAogICAgbGVhZFNvdXJjZTogImlucHV0XzE2IiwKICAgIHN1bW1hcnk6ICJpbnB1dF8xNCIsCiAgICBlZGl0TGluazogImlucHV0XzE1IgogIH0sCiAgTEVBRF9TT1VS
Q0U6ICJSZWhhYiBCdWRnZXQgVG9vbCIsCiAgVVRNX0ZJRUxEUzogeyB1dG1fc291cmNlOiJpbnB1dF8xNyIsIHV0bV9tZWRpdW06ImlucHV0XzE4IiwgdXRtX2NhbXBhaWduOiJpbnB1dF8xOSIsIHV0bV90ZXJtOiJpbnB1dF8yMCIsIHV0bV9jb250ZW50OiJpbnB1
dF8yMSIsIGdjbGlkOiJpbnB1dF8yMiIsIHJlZmVycmVyOiJpbnB1dF8yMyIgfSwKICBUSEFOS19ZT1VfVVJMOiAiaHR0cHM6Ly93d3cudGVybnVzLmNvbS9nb3QtaXQtd2VyZS1vbi1pdC8iLAogIFBSSVZBQ1lfVVJMOiAiaHR0cHM6Ly90ZXJudXMuY29tL3ByaXZh
Y3ktcG9saWN5LyIKfTsKCi8qIC0tLS0tLS0tLS0gREFUQSAoRFJBRlQgXHUyMDE0IGV2ZXJ5IHJhbmdlIHJlcXVpcmVzIFRlcm51cyBhcHByb3ZhbCBiZWZvcmUgbGF1bmNoKSAtLS0tLS0tLS0tICovCnZhciBSQU5HRVNfUkVWSUVXRUQgPSAiRFJBRlQgXHUyMDE0
IG5vdCB5ZXQgYXBwcm92ZWQiOwp2YXIgVEVNUExBVEVfVkVSU0lPTiA9ICJSZWhhYiBMaXN0IFRlbXBsYXRlIFNGUiAoODggaXRlbXMsIHZlcmlmaWVkIGFnYWluc3QgYmxhbmsgdGVtcGxhdGUgMjAyNi0wNy0wNikiOwp2YXIgSVRFTVMgPSBbCntpZDoxLG5hbWU6
IkRlbW8gJiBUcmFzaCBPdXQiLGxvdzoxMDAwLGhpZ2g6ODAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJEZW1vbGl0aW9uIC8gY2xlYW5vdXQgYW5kIGhhdWwtb2ZmIC8gZHVtcHN0ZXJzIFx1MjAxNCB3aGljaCBhcmVhcz8ifSwKe2lkOjIsbmFtZToiQXJjaGl0
ZWN0dXJhbCBQbGFucywgUGVybWl0cywgRmVlcywgRXRjLiIsbG93OjUwMCxoaWdoOjc1MDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxhbnMvc3VydmV5IGFuZCBwZXJtaXRzIFx1MjAxNCBpbnNwZWN0b3IgbmVlZHMgY29waWVzIGFuZCBwcm9vZiBvZiBwYXlt
ZW50OyBpcyB0aGUgcGVybWl0IHBvc3RlZD8ifSwKe2lkOjMsbmFtZToiRm91bmRhdGlvbiBSZXBhaXIiLGxvdzoyNTAwLGhpZ2g6MjUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiV2hhdCBpcyBiZWluZyBkb25lPyBXaGVyZT8ifSwKe2lkOjQsbmFtZToiTW9s
ZCBSZW1lZGlhdGlvbiIsbG93OjEwMDAsaGlnaDoxMDAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJXaGF0IGlzIGJlaW5nIGRvbmU/IFdoZXJlPyJ9LAp7aWQ6NSxuYW1lOiJFeHRlcm1pbmF0b3IiLGxvdzoyNTAsaGlnaDoyNTAwLGJhc2lzOiJwZXIgcHJvamVj
dCIscGg6Ikluc3BlY3Rpb24/IFRyZWF0bWVudD8gU2hvdyBpbnNwZWN0b3IgcHJvb2Ygb2YgcGF5bWVudC9jb21wbGV0aW9uIn0sCntpZDo2LG5hbWU6IkRyaXZld2F5IC8gU2lkZXdhbGsiLGxvdzoxNTAwLGhpZ2g6MTAwMDAsYmFzaXM6InBlciBwcm9qZWN0Iixw
aDoiTmV3PyBTZWFsIHN1cmZhY2U/IEV4dGVuZD8gUmVwYWlyIHNlY3Rpb25zPyJ9LAp7aWQ6NyxuYW1lOiJDaGltbmV5IC8gRmlyZXBsYWNlIC0gUmVwYWlyIC8gUmVwbGFjZSIsbG93OjUwMCxoaWdoOjc1MDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiQnJpY2sg
b3IgdGlsZSB3b3JrPyBMaW5lcj8gRGFtcGVyPyBDaGltbmV5IGNhcD8gSnVzdCBzd2VlcGluZz8ifSwKe2lkOjgsbmFtZToiRGVjayAvIFBhdGlvIC8gUG9yY2giLGxvdzoyMDAwLGhpZ2g6MTUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiTmV3IGJ1aWxkPyBF
eHRlbnNpb24/IFJlcGFpciAvIHN0YWluIC8gcGFpbnQ/IFBsZWFzZSBkZXNjcmliZSJ9LAp7aWQ6OSxuYW1lOiJGZW5jaW5nIixsb3c6MTUwMCxoaWdoOjgwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIHdoYXQgaXMgdG8gYmUgZG9u
ZSBcdTIwMTQgbWF0ZXJpYWwsIGxpbmVhciBmZWV0LCBnYXRlcyJ9LAp7aWQ6MTAsbmFtZToiR2FyYWdlIERvb3JzIC8gR2FyYWdlIERvb3IgT3BlbmVyKHMpIixsb3c6ODAwLGhpZ2g6NDAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJTaW5nbGUvZG91YmxlPyBS
ZXBhaXIgb3IgcmVwbGFjZT8gQXV0byBvcGVuZXI/IE90aGVyPyJ9LAp7aWQ6MTEsbmFtZToiTGFuZHNjYXBpbmcgLSBHZW5lcmFsIixsb3c6MTAwMCxoaWdoOjc1MDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiRGVzY3JpYmUgXHUyMDE0IHdoYXQgc2hvdWxkIHRo
ZSBpbnNwZWN0b3Igc2VlIHRvIGtub3cgdGhpcyBpcyBjb21wbGV0ZT8ifSwKe2lkOjEyLG5hbWU6IkxhbmRzY2FwaW5nIC0gUmV0YWluaW5nIFdhbGwiLGxvdzoyMDAwLGhpZ2g6MTUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIHdo
YXQgaXMgdG8gYmUgZG9uZSBhbmQgd2hlcmUifSwKe2lkOjEzLG5hbWU6IkxhbmRzY2FwaW5nIC0gVHJlZSBSZW1vdmFsIixsb3c6NTAwLGhpZ2g6NTAwMCxiYXNpczoicGVyIHRyZWUvcHJvamVjdCIscGg6IkhvdyBtYW55IHRyZWVzIGFuZCB3aGVyZT8ifSwKe2lk
OjE0LG5hbWU6IlBvb2wgLSBJbi1ncm91bmQgU3dpbW1pbmcgUG9vbCIsbG93OjMwMDAsaGlnaDoyNTAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJSZXBhaXI/IFJlc3VyZmFjZT8gRXF1aXBtZW50PyBGaWxsLWluPyBQbGVhc2UgZGVzY3JpYmUifSwKe2lkOjE1
LG5hbWU6IlJvb2ZpbmcgLSBSZXBhaXIgb3IgUmVwbGFjZSIsbG93OjEwMDAsaGlnaDoxODAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJSaXAgYW5kIGluc3RhbGwgbmV3IHJvb2Y/IFJlcGFpciBkZWNraW5nPyBOZXcgbGF5ZXIgb2Ygc2hpbmdsZXM/IE1hdGVy
aWFsPyJ9LAp7aWQ6MTYsbmFtZToiUm9vZmluZyAtIEd1dHRlcnMgJiBEb3duc3BvdXQiLGxvdzo2MDAsaGlnaDozMDAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6Ikluc3RhbGwgbmV3PyBSZXBhaXIgdG8gZXhpc3Rpbmc/In0sCntpZDoxNyxuYW1lOiJSb29maW5n
IC0gU29mZml0IC8gRmFzY2lhIixsb3c6ODAwLGhpZ2g6NTAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJSZXBhaXIgb3IgcmVwbGFjZSBzb2ZmaXQgLyBmYXNjaWEgXHUyMDE0IHdoZXJlPyJ9LAp7aWQ6MTgsbmFtZToiU2lkaW5nIC8gU3R1Y2NvIixsb3c6MzAw
MCxoaWdoOjIwMDAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6Ikluc3RhbGwgbmV3IC8gcmVwYWlyPyBUeXBlIG9mIHNpZGluZyBvciBzdHVjY28/In0sCntpZDoxOSxuYW1lOiJLaXRjaGVuIC0gQXBwbGlhbmNlcyAtIERpc2h3YXNoZXIiLGxvdzo0MDAsaGlnaDox
MjAwLGJhc2lzOiJwZXIgdW5pdCIscGg6IkRpc2h3YXNoZXIgYmVpbmcgaW5zdGFsbGVkIFx1MjAxNCBicmFuZC9ncmFkZT8ifSwKe2lkOjIwLG5hbWU6IktpdGNoZW4gLSBBcHBsaWFuY2VzIC0gUmFuZ2UgLyBTdG92ZSBUb3AgLyBPdmVuIixsb3c6NjAwLGhpZ2g6
MjUwMCxiYXNpczoicGVyIHVuaXQiLHBoOiJPdmVuIC8gcmFuZ2UgLyBzdG92ZSB0b3AgYmVpbmcgaW5zdGFsbGVkIFx1MjAxNCBicmFuZC9ncmFkZT8ifSwKe2lkOjIxLG5hbWU6IktpdGNoZW4gLSBBcHBsaWFuY2VzIC0gUmFuZ2UgSG9vZCIsbG93OjIwMCxoaWdo
OjEwMDAsYmFzaXM6InBlciB1bml0IixwaDoiUmFuZ2UgaG9vZCBvciBtaWNyb3dhdmUvaG9vZCBjb21ibz8ifSwKe2lkOjIyLG5hbWU6IktpdGNoZW4gLSBBcHBsaWFuY2VzIC0gUmVmcmlnZXJhdG9yIixsb3c6ODAwLGhpZ2g6MzAwMCxiYXNpczoicGVyIHVuaXQi
LHBoOiJSZWZyaWdlcmF0b3IgYmVpbmcgaW5zdGFsbGVkIFx1MjAxNCBicmFuZC9ncmFkZT8ifSwKe2lkOjIzLG5hbWU6IktpdGNoZW4gLSBDYWJpbmV0cnkiLGxvdzozMDAwLGhpZ2g6MTUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiSW5zdGFsbCBuZXcgdXBw
ZXIgYW5kIGxvd2VyIGNhYmluZXRzPyBSZWZ1cmJpc2ggLyByZWZpbmlzaCAvIHBhaW50PyJ9LAp7aWQ6MjQsbmFtZToiS2l0Y2hlbiAtIENvdW50ZXJ0b3BzIixsb3c6MTUwMCxoaWdoOjcwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiTWF0ZXJpYWw6IGZvcm1p
Y2EsIHF1YXJ0eiwgZ3Jhbml0ZSwgdGlsZSwgb3RoZXI/IEJhY2tzcGxhc2g/In0sCntpZDoyNSxuYW1lOiJLaXRjaGVuIC0gRWxlY3RyaWNhbCIsbG93OjUwMCxoaWdoOjM1MDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiV2lyaW5nIG9ubHk/IE91dGxldHMgLyBz
d2l0Y2hlcyAvIHJlY2VwdGFjbGVzPyBBcHBsaWFuY2UgY2lyY3VpdHM/In0sCntpZDoyNixuYW1lOiJLaXRjaGVuIC0gUGx1bWJpbmciLGxvdzo1MDAsaGlnaDozNTAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6IldoYXQgZml4dHVyZXMsIHdoYXQgbG9jYXRpb25z
PyJ9LAp7aWQ6MjcsbmFtZToiS2l0Y2hlbiAtIE90aGVyIixsb3c6MjUwLGhpZ2g6NTAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJXaGF0IGVsc2UgaXMgaW4gdGhlIGtpdGNoZW4gc2NvcGU/In0sCntpZDoyOCxuYW1lOiJNYWluIEJhdGhyb29tIC0gRWxlY3Ry
aWNhbCIsbG93OjMwMCxoaWdoOjE1MDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiR0ZDSSBvdXRsZXRzPyBMaWdodGluZz8gRXhoYXVzdCBmYW4/In0sCntpZDoyOSxuYW1lOiJNYWluIEJhdGhyb29tIC0gRnVsbCBSZW1vZGVsIixsb3c6NTAwMCxoaWdoOjIwMDAw
LGJhc2lzOiJwZXIgcHJvamVjdCIscGg6IlR1Yj8gU2hvd2VyPyBTdXJyb3VuZD8gVmFuaXR5PyBUb2lsZXQ/IFdhbGwgdGlsZT8gV2hhdCBlbHNlPyJ9LAp7aWQ6MzAsbmFtZToiTWFpbiBCYXRocm9vbSAtIFBsdW1iaW5nIixsb3c6NTAwLGhpZ2g6MzUwMCxiYXNp
czoicGVyIHByb2plY3QiLHBoOiJQbGVhc2UgZGVzY3JpYmUgd2hhdCBpcyB0byBiZSBkb25lIn0sCntpZDozMSxuYW1lOiJNYWluIEJhdGhyb29tIC0gVGlsZSIsbG93OjgwMCxoaWdoOjQwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiV2hpY2ggc3VyZmFjZXMg
XHUyMDE0IGZsb29yLCBvciB3YWxsIHRpbGUgdG9vPyJ9LAp7aWQ6MzIsbmFtZToiTWFpbiBCYXRocm9vbSAtIFRvaWxldCIsbG93OjIwMCxoaWdoOjgwMCxiYXNpczoicGVyIHVuaXQiLHBoOiJOZXcgdG9pbGV0KHMpIFx1MjAxNCBob3cgbWFueT8ifSwKe2lkOjMz
LG5hbWU6Ik1haW4gQmF0aHJvb20gLSBUdWIgLyBTaG93ZXIgLyBTdXJyb3VuZCIsbG93OjEwMDAsaGlnaDo2MDAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6IlR1Yj8gU2hvd2VyPyBTdXJyb3VuZD8gUGxlYXNlIGRlc2NyaWJlIn0sCntpZDozNCxuYW1lOiJNYWlu
IEJhdGhyb29tIC0gVmFuaXR5IC8gU2luayIsbG93OjQwMCxoaWdoOjI1MDAsYmFzaXM6InBlciB1bml0IixwaDoiVmFuaXR5PyBTaW5rPyBGYXVjZXQ/In0sCntpZDozNSxuYW1lOiJNYWluIEJhdGhyb29tIC0gT3RoZXIiLGxvdzoyNTAsaGlnaDozMDAwLGJhc2lz
OiJwZXIgcHJvamVjdCIscGg6IldoYXQgZWxzZSBpbiB0aGlzIGJhdGhyb29tPyJ9LAp7aWQ6MzYsbmFtZToiQmF0aHJvb20gLSBFbGVjdHJpY2FsIixsb3c6MzAwLGhpZ2g6MTUwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJHRkNJIG91dGxldHM/IExpZ2h0aW5n
PyBFeGhhdXN0IGZhbnM/IChhbGwgYWRkaXRpb25hbCBiYXRocyBjb21iaW5lZCkifSwKe2lkOjM3LG5hbWU6IkJhdGhyb29tIC0gRnVsbCBSZW1vZGVsIixsb3c6NDAwMCxoaWdoOjE1MDAwLGJhc2lzOiJwZXIgYmF0aHJvb20iLHBoOiJUdWI/IFNob3dlcj8gU3Vy
cm91bmQ/IFZhbml0eT8gVG9pbGV0PyBXYWxsIHRpbGU/IFdoYXQgZWxzZT8ifSwKe2lkOjM4LG5hbWU6IkJhdGhyb29tIC0gUGx1bWJpbmciLGxvdzo1MDAsaGlnaDozMDAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6IlBsZWFzZSBkZXNjcmliZSB3aGF0IGlzIHRv
IGJlIGRvbmUifSwKe2lkOjM5LG5hbWU6IkJhdGhyb29tIC0gVGlsZSIsbG93OjYwMCxoaWdoOjM1MDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiV2hpY2ggcm9vbXMgXHUyMDE0IGZsb29yLCBvciB3YWxsIHRpbGUgdG9vPyJ9LAp7aWQ6NDAsbmFtZToiQmF0aHJv
b20gLSBUb2lsZXQiLGxvdzoyMDAsaGlnaDo4MDAsYmFzaXM6InBlciB1bml0IixwaDoiTmV3IHRvaWxldChzKSBcdTIwMTQgaG93IG1hbnk/In0sCntpZDo0MSxuYW1lOiJCYXRocm9vbSAtIFR1YiAvIFNob3dlciAvIFN1cnJvdW5kIixsb3c6MTAwMCxoaWdoOjUw
MDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiVHViPyBTaG93ZXI/IFN1cnJvdW5kPyBQbGVhc2UgZGVzY3JpYmUifSwKe2lkOjQyLG5hbWU6IkJhdGhyb29tIC0gVmFuaXR5IC8gU2luayIsbG93OjMwMCxoaWdoOjIwMDAsYmFzaXM6InBlciB1bml0IixwaDoiVmFu
aXR5PyBTaW5rPyBGYXVjZXQ/In0sCntpZDo0MyxuYW1lOiJCYXRocm9vbSAtIE90aGVyIixsb3c6MjUwLGhpZ2g6MzAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJXaGF0IGVsc2UgaW4gdGhlIGFkZGl0aW9uYWwgYmF0aChzKT8ifSwKe2lkOjQ0LG5hbWU6Ik1h
aW4gQmVkcm9vbSAtIEZsb29yaW5nIixsb3c6NTAwLGhpZ2g6MzAwMCxiYXNpczoicGVyIHJvb20iLHBoOiJXaGF0IGZsb29yaW5nIHR5cGU/In0sCntpZDo0NSxuYW1lOiJNYWluIEJlZHJvb20gLSBGdWxsIFJlbW9kZWwiLGxvdzoyMDAwLGhpZ2g6ODAwMCxiYXNp
czoicGVyIHJvb20iLHBoOiJGbG9vcmluZywgcGFpbnQsIHRyaW0sIGRvb3JzLCBsaWdodGluZyBcdTIwMTQgZGVzY3JpYmUgdGhlIGZ1bGwgcmVmcmVzaCJ9LAp7aWQ6NDYsbmFtZToiTWFpbiBCZWRyb29tIC0gV2FsbHMiLGxvdzo0MDAsaGlnaDoyNTAwLGJhc2lz
OiJwZXIgcm9vbSIscGg6IkRyeXdhbGwgcmVwYWlyLCB0ZXh0dXJlLCBwYWludC1yZWFkeT8ifSwKe2lkOjQ3LG5hbWU6IkJlZHJvb20ocykgLSBGbG9vcmluZyIsbG93OjgwMCxoaWdoOjUwMDAsYmFzaXM6ImNvbWJpbmVkIixwaDoiV2hhdCBmbG9vcmluZyB0eXBl
IGFuZCB3aGljaCByb29tcz8ifSwKe2lkOjQ4LG5hbWU6IkJlZHJvb20ocykgLSBGdWxsIFJlbW9kZWwiLGxvdzozMDAwLGhpZ2g6MTIwMDAsYmFzaXM6ImNvbWJpbmVkIixwaDoiRnVsbCBjb3NtZXRpYyByZW1vZGVsIFx1MjAxNCBkZXNjcmliZSBzY29wZSAoYWxs
IHNlY29uZGFyeSBiZWRyb29tcykifSwKe2lkOjQ5LG5hbWU6IkJlZHJvb20ocykgLSBXYWxscyIsbG93OjYwMCxoaWdoOjQwMDAsYmFzaXM6ImNvbWJpbmVkIixwaDoiV2FsbCByZXBhaXIgYW5kIHByZXAgXHUyMDE0IHdoaWNoIHJvb21zPyJ9LAp7aWQ6NTAsbmFt
ZToiQmFzZW1lbnQgUmVmaW5pc2hpbmciLGxvdzo1MDAwLGhpZ2g6MzUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIHRoZSBmaW5pc2gtb3V0IHNjb3BlIn0sCntpZDo1MSxuYW1lOiJCYXNlbWVudCBXYXRlcnByb29maW5nIixsb3c6
MjAwMCxoaWdoOjEyMDAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6IlBsZWFzZSBkZXNjcmliZSB3aGF0IGlzIHRvIGJlIGRvbmUifSwKe2lkOjUyLG5hbWU6IkJhc2VtZW50IE90aGVyIixsb3c6NTAwLGhpZ2g6NzUwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJX
aGF0IGVsc2UgaW4gdGhlIGJhc2VtZW50PyJ9LAp7aWQ6NTMsbmFtZToiU3RhaXJ3YXlzIC0gSW50ZXJpb3IgLyBFeHRlcmlvciIsbG93OjUwMCxoaWdoOjUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiVHJlYWRzPyBSYWlsaW5ncz8gU3RydWN0dXJlPyBJbnRl
cmlvciBvciBleHRlcmlvcj8ifSwKe2lkOjU0LG5hbWU6IkZsb29yaW5nIC0gQ2FycGV0aW5nIixsb3c6MTAwMCxoaWdoOjUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUmVwbGFjZW1lbnQ/IENsZWFuaW5nPyBXaGF0IHJvb21zPyJ9LAp7aWQ6NTUsbmFtZToi
Rmxvb3JpbmcgLSBIYXJkd29vZCIsbG93OjI1MDAsaGlnaDoxMjAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJOZXcgaW5zdGFsbGF0aW9uPyBSZXBhaXI/IFJlZmluaXNoaW5nPyBXaGVyZT8ifSwKe2lkOjU2LG5hbWU6IkZsb29yaW5nIC0gVGlsZSIsbG93OjE1
MDAsaGlnaDo4MDAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6IldoaWNoIHJvb21zPyBKdXN0IGZsb29yaW5nIG9yIHdhbGwgZmluaXNoIHRvbz8ifSwKe2lkOjU3LG5hbWU6IkZsb29yaW5nIC0gVmlueWwgLyBMYW1pbmF0ZSIsbG93OjE1MDAsaGlnaDo3MDAwLGJh
c2lzOiJwZXIgcHJvamVjdCIscGg6IldoYXQgZmxvb3JpbmcgdHlwZSBhbmQgd2hpY2ggcm9vbXM/In0sCntpZDo1OCxuYW1lOiJGbG9vcmluZyAtIE90aGVyIixsb3c6NTAwLGhpZ2g6NTAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJXaGF0IGZsb29yaW5nIGFu
ZCB3aGVyZT8ifSwKe2lkOjU5LG5hbWU6IkxhdW5kcnkgLSBDbG90aGVzIERyeWVyIixsb3c6NDAwLGhpZ2g6MTUwMCxiYXNpczoicGVyIHVuaXQiLHBoOiJIb29rLXVwIG9yIHJlbG9jYXRpb24/IFZlbnRpbmcgYW5kIGNvbm5lY3Rpb25zIn0sCntpZDo2MCxuYW1l
OiJMYXVuZHJ5IC0gQ2xvdGhlcyBXYXNoZXIiLGxvdzo0MDAsaGlnaDoxNTAwLGJhc2lzOiJwZXIgdW5pdCIscGg6Ikhvb2stdXAgb3IgcmVsb2NhdGlvbj8gU3VwcGx5LCBkcmFpbiwgcGFuIn0sCntpZDo2MSxuYW1lOiJEb29ycyAtIEludGVyaW9yIChob3cgbWFu
eT8pIixsb3c6MTUwLGhpZ2g6NDUwLGJhc2lzOiJwZXIgZG9vciIscGg6IlBsZWFzZSBkZXNjcmliZSBcdTIwMTQgaG93IG1hbnkgYW5kIHdoZXJlPyJ9LAp7aWQ6NjIsbmFtZToiRG9vcnMgLSBFeHRlcmlvciAoaG93IG1hbnk/KSIsbG93OjQwMCxoaWdoOjI1MDAs
YmFzaXM6InBlciBkb29yIixwaDoiUGxlYXNlIGRlc2NyaWJlIFx1MjAxNCBob3cgbWFueSBhbmQgd2hlcmU/In0sCntpZDo2MyxuYW1lOiJQYWludGluZyAtIEludGVyaW9yIixsb3c6MjAwMCxoaWdoOjgwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiSW50ZXJp
b3IgcGFpbnQ6IHdhbGxzLCBjZWlsaW5ncywgY2xvc2V0cywgdHJpbSBcdTIwMTQgd2hpY2ggcm9vbXM/In0sCntpZDo2NCxuYW1lOiJQYWludGluZyAtIEV4dGVyaW9yIixsb3c6MjUwMCxoaWdoOjEwMDAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6IkFsbCBleHRl
cmlvcj8gT3IganVzdCB0cmltIC8gc29mZml0cyAvIGZhc2NpYT8ifSwKe2lkOjY1LG5hbWU6IkhvdCBXYXRlciBIZWF0ZXIiLGxvdzo4MDAsaGlnaDoyNTAwLGJhc2lzOiJwZXIgdW5pdCIscGg6IlJlbW92ZSBhbmQgcmVwbGFjZSBob3Qgd2F0ZXIgaGVhdGVyIFx1
MjAxNCB0YW5rIG9yIHRhbmtsZXNzPyJ9LAp7aWQ6NjYsbmFtZToiSFZBQyAtIEEvQyIsbG93OjM1MDAsaGlnaDo5MDAwLGJhc2lzOiJwZXIgc3lzdGVtIixwaDoiUmVwYWlyIG9yIHJlcGxhY2U/IEFDIGNvbmRlbnNlciAvIGFpciBoYW5kbGVyPyJ9LAp7aWQ6Njcs
bmFtZToiSFZBQyAtIER1Y3QsIG9yIEJhc2Vib2FyZCBXb3JrIixsb3c6MTUwMCxoaWdoOjgwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiRHVjdHdvcmsgb3IgYmFzZWJvYXJkIFx1MjAxNCBwbGVhc2UgZGVzY3JpYmUifSwKe2lkOjY4LG5hbWU6IkhWQUMgLSBG
dXJuYWNlIC8gQm9pbGVyIixsb3c6MzAwMCxoaWdoOjEwMDAwLGJhc2lzOiJwZXIgc3lzdGVtIixwaDoiUmVwYWlyPyBSZXBsYWNlPyBTZXJ2aWNlIG9ubHk/IEJvaWxlciAvIGZ1cm5hY2UgLyBoZWF0IHB1bXA/In0sCntpZDo2OSxuYW1lOiJIVkFDIC0gT3RoZXIi
LGxvdzo1MDAsaGlnaDo1MDAwLGJhc2lzOiJwZXIgcHJvamVjdCIscGg6Ik1pbmktc3BsaXRzLCB0aGVybW9zdGF0cywgc2VydmljZSBcdTIwMTQgcGxlYXNlIGRlc2NyaWJlIn0sCntpZDo3MCxuYW1lOiJJbnN1bGF0aW9uIixsb3c6MTAwMCxoaWdoOjYwMDAsYmFz
aXM6InBlciBwcm9qZWN0IixwaDoiTG9jYXRpb24gYW5kIHR5cGU6IHdhbGxzLCBmbG9vcnMsIGF0dGljcywgc2lsbHM/In0sCntpZDo3MSxuYW1lOiJFbGVjdHJpY2FsIC0gRmFuIC8gTGlnaHQgRml4dHVyZXMiLGxvdzo1MDAsaGlnaDozMDAwLGJhc2lzOiJwZXIg
cHJvamVjdCIscGg6Ik5ldyBsaWdodCBmaXh0dXJlcyAvIGZhbnM/IEhvdyBtYW55LCB3aGVyZT8ifSwKe2lkOjcyLG5hbWU6IkVsZWN0cmljYWwgLSBQYW5lbCAvIEdlbmVyYWwgV2lyaW5nIixsb3c6MTUwMCxoaWdoOjEyMDAwLGJhc2lzOiJwZXIgcHJvamVjdCIs
cGg6IlJlcGFpcnM/IEluc3RhbGwgbmV3PyBVcGdyYWRlIHRvIHdoYXQgYW1wZXJhZ2U/In0sCntpZDo3MyxuYW1lOiJFbGVjdHJpY2FsIC0gUmVjZXB0YWNsZXMgLyBTd2l0Y2hlcyIsbG93OjMwMCxoaWdoOjIwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiT3V0
bGV0cyAvIHN3aXRjaGVzIC8gcmVjZXB0YWNsZXMgXHUyMDE0IHJlcGxhY2Ugd2hlcmU/In0sCntpZDo3NCxuYW1lOiJQbHVtYmluZyAtIEdhcyBMaW5lcyIsbG93OjUwMCxoaWdoOjQwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIHdo
YXQgaXMgdG8gYmUgZG9uZSJ9LAp7aWQ6NzUsbmFtZToiUGx1bWJpbmcgLSBTZXdlciBTZXB0aWMiLGxvdzoxNTAwLGhpZ2g6MTUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiU2VwdGljIGNsZWFuLW91dCAvIHJpc2VyIC8gbmV3IHRhbmsgLyBsZWFjaGluZyBm
aWVsZHM/IFNld2VyIGxpbmUgcmVwYWlyPyJ9LAp7aWQ6NzYsbmFtZToiUGx1bWJpbmcgLSBPdGhlciIsbG93OjUwMCxoaWdoOjUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIn0sCntpZDo3NyxuYW1lOiJDYXJwZW50cnkgLSBSb3Vn
aCAvIEZyYW1pbmciLGxvdzoxNTAwLGhpZ2g6MTUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiV2hhdCBpcyBiZWluZyBkb25lPyBXaGVyZT8ifSwKe2lkOjc4LG5hbWU6IkNhcnBlbnRyeSAtIFRyaW0gLyBGaW5pc2giLGxvdzo4MDAsaGlnaDo2MDAwLGJhc2lz
OiJwZXIgcHJvamVjdCIscGg6IkJhc2Vib2FyZHMsIGRvb3JzLCBjcm93biBtb2xkaW5ncywgb3RoZXI/In0sCntpZDo3OSxuYW1lOiJEcnl3YWxsIC0gUmVtb3ZlIC8gUmVwbGFjZSIsbG93OjEwMDAsaGlnaDoxMDAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJQ
bGVhc2UgZGVzY3JpYmUgd2hhdCBpcyB0byBiZSBkb25lIn0sCntpZDo4MCxuYW1lOiJXYWxsIC0gUmVtb3ZlICYgUmVwbGFjZSIsbG93OjE1MDAsaGlnaDoxMDAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJXaGljaCB3YWxscz8gTG9hZC1iZWFyaW5nPyJ9LAp7
aWQ6ODEsbmFtZToiV2FsbCAtIFJlcGFpciIsbG93OjMwMCxoaWdoOjMwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIHdoYXQgaXMgdG8gYmUgZG9uZSBhbmQgd2hlcmUifSwKe2lkOjgyLG5hbWU6IldhbGwgLSBXYWxscGFwZXIgLyBX
YWxsIENvdmVyaW5nIixsb3c6MzAwLGhpZ2g6MzAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJSZW1vdmFsIG9yIGluc3RhbGwgXHUyMDE0IHdoaWNoIHJvb21zPyJ9LAp7aWQ6ODMsbmFtZToiV2luZG93cyAoaG93IG1hbnk/KSIsbG93OjM1MCxoaWdoOjkwMCxi
YXNpczoicGVyIHdpbmRvdyIscGg6IlBsZWFzZSBkZXNjcmliZSBcdTIwMTQgaG93IG1hbnkgYW5kIHdoZXJlPyJ9LAp7aWQ6ODQsbmFtZToiT3RoZXIgLSBBcHBsaWFuY2VzIixsb3c6MjUwLGhpZ2g6MzAwMCxiYXNpczoicGVyIHByb2plY3QiLHBoOiJXaGljaCBh
cHBsaWFuY2VzIFx1MjAxNCBwbGVhc2UgbGlzdCJ9LAp7aWQ6ODUsbmFtZToiT3RoZXIgLSBJbnRlcmlvciIsbG93OjI1MCxoaWdoOjUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIHdoYXQgaXMgdG8gYmUgZG9uZSJ9LAp7aWQ6ODYs
bmFtZToiT3RoZXIgLSBFeHRlcmlvciIsbG93OjI1MCxoaWdoOjUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIHdoYXQgaXMgdG8gYmUgZG9uZSJ9LAp7aWQ6ODcsbmFtZToiT3RoZXIgLSBNZWNoYW5pY2FscyIsbG93OjI1MCxoaWdo
OjUwMDAsYmFzaXM6InBlciBwcm9qZWN0IixwaDoiUGxlYXNlIGRlc2NyaWJlIHdoYXQgaXMgdG8gYmUgZG9uZSJ9LAp7aWQ6ODgsbmFtZToiQ29udGluZ2VuY2llcyAoNSUtMTAlIHJlY29tbWVuZGVkKSIsbG93Om51bGwsaGlnaDpudWxsLGJhc2lzOiIlIG9mIHN1
YnRvdGFsIixwaDoiVW5mb3Jlc2VlbiBleHBlbnNlcyAmIGNvc3Qgb3ZlcnJ1bnMifQpdOwp2YXIgTVVMVCA9IHtBTDowLjg4LEFLOjEuMjUsQVo6MC45OCxBUjowLjg3LENBOjEuMyxDTzoxLjA1LENUOjEuMTIsREU6MS4wMixEQzoxLjIsRkw6MC45OCxHQTowLjky
LEhJOjEuNCxJRDowLjk1LElMOjEuMDUsSU46MC45MixJQTowLjkyLEtTOjAuOSxLWTowLjksTEE6MC45MixNRToxLjAyLE1EOjEuMDgsTUE6MS4xOCxNSTowLjk4LE1OOjEuMDUsTVM6MC44NSxNTzowLjkyLE1UOjAuOTgsTkU6MC45LE5WOjEuMDIsTkg6MS4wNSxO
SjoxLjE1LE5NOjAuOTIsTlk6MS4yNSxOQzowLjkyLE5EOjAuOTUsT0g6MC45NSxPSzowLjg3LE9SOjEuMDgsUEE6MS4wMixSSToxLjA4LFNDOjAuOSxTRDowLjksVE46MC45MixUWDowLjk1LFVUOjAuOTgsVlQ6MS4wNSxWQToxLFdBOjEuMTIsV1Y6MC44OCxXSTow
Ljk4LFdZOjAuOTV9OwoKLyogV2l6YXJkIHN0cnVjdHVyZSBcdTIwMTQgZXZlcnkgYW5zd2VyIG1hcHMgdG8gZXhhY3RseSBvbmUgZHJhdyBpdGVtIElEIChhcHByb3ZlZCBtYXBwaW5nIGRvYykgKi8KdmFyIFNFQ1RJT05TID0gWwp7a2V5OiJzMiIsc3RlcDoyLHRp
dGxlOiJEZW1vLCBQbGFucyAmIFNpdGUgUHJlcCIsdG9nZ2xlOm51bGwsZ3JvdXBzOlt7aXRlbXM6WzEsMiw1LDRdfV19LAp7a2V5OiJzMyIsc3RlcDozLHRpdGxlOiJFeHRlcmlvciAmIFNpdGUiLHRvZ2dsZToiRG9lcyB0aGlzIHByb2plY3QgaW5jbHVkZSBleHRl
cmlvciBvciBzaXRlIHdvcms/Iixub3RlOiJTaXRlIHdvcmsgaXMgZXZlcnl0aGluZyBvbiB0aGUgcHJvcGVydHkgb3V0c2lkZSB0aGUgaG91c2UgaXRzZWxmIFx1MjAxNCBncmFkaW5nIGFuZCBkcmFpbmFnZSwgZHJpdmV3YXlzIGFuZCB3YWxrd2F5cywgZGVja3Mg
YW5kIGZlbmNpbmcsIGxhbmRzY2FwaW5nLCB0cmVlIHJlbW92YWwsIHNlcHRpYywgcG9vbHMsIGFuZCBvdXRidWlsZGluZ3MuIElmIHlvdXIgcHJvamVjdCBkb2VzIG5vdCB0b3VjaCB0aGUgZXh0ZXJpb3Igb3IgdGhlIGxvdCwgY2hvb3NlIE5vLiIsZ3JvdXBzOlt7
aXRlbXM6WzYsOCw5LDEwLDExLDEyLDEzLDE0LDE4LDY0LDYyLDgzLDg2XX1dfSwKe2tleToiczQiLHN0ZXA6NCx0aXRsZToiUm9vZiIsdG9nZ2xlOiJEb2VzIHRoaXMgcHJvamVjdCBpbmNsdWRlIHJvb2Ygd29yaz8iLGdyb3Vwczpbe2l0ZW1zOlsxNSwxNiwxN119
XX0sCntrZXk6InM1IixzdGVwOjUsdGl0bGU6IlN0cnVjdHVyZSAmIEZvdW5kYXRpb24iLHRvZ2dsZToiRG9lcyB0aGlzIHByb2plY3QgaW5jbHVkZSBzdHJ1Y3R1cmFsIG9yIGZvdW5kYXRpb24gd29yaz8iLGdyb3Vwczpbe2l0ZW1zOlszLDcsNzcsODAsODEsNzBd
fV19LAp7a2V5OiJzNiIsc3RlcDo2LHRpdGxlOiJLaXRjaGVuIix0b2dnbGU6IkRvZXMgdGhpcyBwcm9qZWN0IGluY2x1ZGUga2l0Y2hlbiB3b3JrPyIsZ3JvdXBzOlt7aXRlbXM6WzE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3XX1dfSwKe2tleToiczciLHN0ZXA6
Nyx0aXRsZToiTWFpbiBCYXRocm9vbSIsdG9nZ2xlOiJEb2VzIHRoaXMgcHJvamVjdCBpbmNsdWRlIG1haW4gYmF0aHJvb20gd29yaz8iLGdyb3Vwczpbe2l0ZW1zOlsyOSwyOCwzMCwzMSwzMiwzMywzNCwzNV0scmVtb2RlbDoyOX1dfSwKe2tleToiczgiLHN0ZXA6
OCx0aXRsZToiQWRkaXRpb25hbCBCYXRocm9vbShzKSIsdG9nZ2xlOiJEb2VzIHRoaXMgcHJvamVjdCBpbmNsdWRlIGFkZGl0aW9uYWwgYmF0aHJvb20gd29yaz8iLG5vdGU6Ik11bHRpcGxlIGFkZGl0aW9uYWwgYmF0aHJvb21zIGFyZSBlbnRlcmVkIGFzIGNvbWJp
bmVkIGFtb3VudHMgXHUyMDE0IHRoaXMgbWF0Y2hlcyB0aGUgVGVybnVzIFNGUiBkcmF3IHRlbXBsYXRlLiIsZ3JvdXBzOlt7aXRlbXM6WzM3LDM2LDM4LDM5LDQwLDQxLDQyLDQzXSxyZW1vZGVsOjM3fV19LAp7a2V5OiJzOSIsc3RlcDo5LHRpdGxlOiJCZWRyb29t
cyIsdG9nZ2xlOiJEb2VzIHRoaXMgcHJvamVjdCBpbmNsdWRlIGJlZHJvb20gd29yaz8iLGdyb3Vwczpbe2xhYmVsOiJNYWluIGJlZHJvb20iLGl0ZW1zOls0NSw0NCw0Nl0scmVtb2RlbDo0NX0se2xhYmVsOiJPdGhlciBiZWRyb29tcyAoY29tYmluZWQpIixpdGVt
czpbNDgsNDcsNDldLHJlbW9kZWw6NDh9XX0sCntrZXk6InMxMCIsc3RlcDoxMCx0aXRsZToiSW50ZXJpb3IgJiBMaXZpbmcgQXJlYXMiLHRvZ2dsZToiRG9lcyB0aGlzIHByb2plY3QgaW5jbHVkZSBpbnRlcmlvciBvciBsaXZpbmctYXJlYSB3b3JrPyIsZ3JvdXBz
Olt7aXRlbXM6WzUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDYxLDYzLDc4LDc5LDgyLDg1XX1dfSwKe2tleToiczExIixzdGVwOjExLHRpdGxlOiJNZWNoYW5pY2FscywgRWxlY3RyaWNhbCAmIFBsdW1iaW5nIix0b2dnbGU6IkRvZXMgdGhpcyBwcm9qZWN0IGlu
Y2x1ZGUgbWVjaGFuaWNhbCwgZWxlY3RyaWNhbCwgb3IgcGx1bWJpbmcgd29yaz8iLGdyb3Vwczpbe2l0ZW1zOls2NSw2Niw2Nyw2OCw2OSw3MSw3Miw3Myw3NCw3NSw3Niw2MCw1OSw4NCw4N119XX0KXTsKdmFyIFNUQVRFUyA9IFsiQUwiLCJBSyIsIkFaIiwiQVIi
LCJDQSIsIkNPIiwiQ1QiLCJERSIsIkRDIiwiRkwiLCJHQSIsIkhJIiwiSUQiLCJJTCIsIklOIiwiSUEiLCJLUyIsIktZIiwiTEEiLCJNRSIsIk1EIiwiTUEiLCJNSSIsIk1OIiwiTVMiLCJNTyIsIk1UIiwiTkUiLCJOViIsIk5IIiwiTkoiLCJOTSIsIk5ZIiwiTkMi
LCJORCIsIk9IIiwiT0siLCJPUiIsIlBBIiwiUkkiLCJTQyIsIlNEIiwiVE4iLCJUWCIsIlVUIiwiVlQiLCJWQSIsIldBIiwiV1YiLCJXSSIsIldZIl07Ci8qIENvc3QgcmFuZ2VzIGFuZCB0aGUgZHJhdyBmb3JtYXQgYXJlIGJ1aWx0IGZvciBTRlI7IG90aGVyIHR5
cGVzIHJldXNlIHRoZSBzYW1lCiAgIGl0ZW0gbGlzdCBhbmQgdGVtcGxhdGUgLSB0aGUgdHlwZSBpcyBjYXB0dXJlZCBmb3IgdGhlIGxlYWQgYW5kIHRoZSBleHBvcnRzLiAqLwp2YXIgUFRZUEVTID0gWyJTRlIiLCIyLTQgVW5pdHMiLCI1IFVuaXRzIiwiQ29uZG8i
LCJUb3duaG91c2UiLCJQVUQiXTsKdmFyIERJU0NMQUlNRVIgPSAiQ29zdCByYW5nZXMgYXJlIG5hdGlvbmFsIHBsYW5uaW5nIGVzdGltYXRlcyBhZGp1c3RlZCBmb3IgeW91ciBzdGF0ZSAtIHZlcmlmeSBhbGwgY29zdHMgd2l0aCB5b3VyIGNvbnRyYWN0b3JzLiBV
c2VyLWVudGVyZWQgZmlndXJlcyBhcmUgcGxhbm5pbmcgZXN0aW1hdGVzIG9ubHkuIE5vdCBhIGJpZCwgYXBwcmFpc2FsLCBsb2FuIGFwcHJvdmFsLCBvciBmZWFzaWJpbGl0eSBkZXRlcm1pbmF0aW9uLiBBbnkgZmluYW5jaW5nIHN1YmplY3QgdG8gdW5kZXJ3cml0
aW5nIGFuZCBmaW5hbCBhcHByb3ZhbC4iOwovKiBaaXAgcHJlZml4IChmaXJzdCAzIGRpZ2l0cykgdG8gc3RhdGUsIHNvIHRoZSBjb3N0LWd1aWRhbmNlIHN0YXRlIGFsd2F5cyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSB6aXAuCiAgIEZpcnN0IG1hdGNoaW5nIHJhbmdl
IHdpbnMgKDczMyBBdXN0aW4gVFggcHJlY2VkZXMgdGhlIE9LIGJsb2NrKS4gVW5rbm93bi90ZXJyaXRvcnkgcHJlZml4ZXMgcmV0dXJuICIiLiAqLwp2YXIgWklQX1JBTkdFUz1bWzczMyw3MzMsIlRYIl0sWzEwLDI3LCJNQSJdLFsyOCwyOSwiUkkiXSxbMzAsMzgs
Ik5IIl0sWzM5LDQ5LCJNRSJdLFs1MCw1OSwiVlQiXSxbNjAsNjksIkNUIl0sWzcwLDg5LCJOSiJdLFsxMDAsMTQ5LCJOWSJdLFsxNTAsMTk2LCJQQSJdLFsxOTcsMTk5LCJERSJdLFsyMDEsMjAxLCJWQSJdLFsyMDAsMjA1LCJEQyJdLFsyMDYsMjE5LCJNRCJdLFsy
MjAsMjQ2LCJWQSJdLFsyNDcsMjY4LCJXViJdLFsyNzAsMjg5LCJOQyJdLFsyOTAsMjk5LCJTQyJdLFszMDAsMzE5LCJHQSJdLFszMjAsMzQ5LCJGTCJdLFszNTAsMzY5LCJBTCJdLFszNzAsMzg1LCJUTiJdLFszODYsMzk3LCJNUyJdLFszOTgsMzk5LCJHQSJdLFs0
MDAsNDI3LCJLWSJdLFs0MzAsNDU5LCJPSCJdLFs0NjAsNDc5LCJJTiJdLFs0ODAsNDk5LCJNSSJdLFs1MDAsNTI4LCJJQSJdLFs1MzAsNTQ5LCJXSSJdLFs1NTAsNTY3LCJNTiJdLFs1NzAsNTc3LCJTRCJdLFs1ODAsNTg4LCJORCJdLFs1OTAsNTk5LCJNVCJdLFs2
MDAsNjI5LCJJTCJdLFs2MzAsNjU4LCJNTyJdLFs2NjAsNjc5LCJLUyJdLFs2ODAsNjkzLCJORSJdLFs3MDAsNzE0LCJMQSJdLFs3MTYsNzI5LCJBUiJdLFs3MzAsNzQ5LCJPSyJdLFs3NTAsNzk5LCJUWCJdLFs4MDAsODE2LCJDTyJdLFs4MjAsODMxLCJXWSJdLFs4
MzIsODM4LCJJRCJdLFs4NDAsODQ3LCJVVCJdLFs4NTAsODY1LCJBWiJdLFs4NzAsODg0LCJOTSJdLFs4ODUsODg1LCJUWCJdLFs4ODksODk4LCJOViJdLFs5MDAsOTYxLCJDQSJdLFs5NjcsOTY4LCJISSJdLFs5NzAsOTc5LCJPUiJdLFs5ODAsOTk0LCJXQSJdLFs5
OTUsOTk5LCJBSyJdLFs1NjksNTY5LCJEQyJdXTsKZnVuY3Rpb24gc3RGcm9tWmlwKHopewogIHZhciBtPVN0cmluZyh6fHwiIikubWF0Y2goL15ccyooXGR7NX0pLyk7IGlmKCFtKSByZXR1cm4gIiI7CiAgdmFyIHA9K21bMV0uc2xpY2UoMCwzKTsKICBmb3IodmFy
IGk9MDtpPFpJUF9SQU5HRVMubGVuZ3RoO2krKyl7IGlmKHA+PVpJUF9SQU5HRVNbaV1bMF0mJnA8PVpJUF9SQU5HRVNbaV1bMV0pIHJldHVybiBaSVBfUkFOR0VTW2ldWzJdOyB9CiAgcmV0dXJuICIiOwp9CgovKiAtLS0tLS0tLS0tIFNUQVRFIC0tLS0tLS0tLS0g
Ki8KdmFyIGJ5SWQgPSB7fTsgSVRFTVMuZm9yRWFjaChmdW5jdGlvbihpdCl7IGJ5SWRbaXQuaWRdPWl0OyB9KTsKdmFyIHN0YXRlID0gewogIHN0ZXA6IDEsCiAgaGRyOiB7Ym9ycm93ZXI6IiIsYWRkcjoiIixjaXR5OiIiLHN0OiIiLHppcDoiIixzcWZ0OiIiLHNx
ZnRSOiIiLHB0eXBlOiJTRlIiLHVuaXRzOjIsYmVkc0M6IiIsYmVkc1I6IiIsYmF0aHNDOiIiLGJhdGhzUjoiIixtb250aHM6IiIsZGVzYzoiIn0sCiAgYW1vdW50czoge30sICAgLy8gaWQgLT4gbnVtYmVyICh3aG9sZS1wcm9wZXJ0eSB0b3RhbHM7IGRlcml2ZWQg
ZnJvbSB1YW10cyB3aGVuIG11bHRpLXVuaXQpCiAgdWFtdHM6IHt9LCAgICAgLy8gaWQgLT4gW3Blci11bml0IGFtb3VudHNdLCBtdWx0aS11bml0IHByb3BlcnR5IHR5cGVzIG9ubHkKICBkZXNjczoge30sICAgICAvLyBpZCAtPiBzdHJpbmcKICB0b2dnbGVzOiB7
fSwgICAvLyBzZWN0aW9uIGtleSAtPiBib29sCiAgY29udE1hbnVhbDogZmFsc2UsCiAgc3VibWl0dGVkOiAhIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ0cmJ0X2xlYWRfZG9uZSIpLAogIHN0YXJ0VHJhY2tlZDogZmFsc2UsCiAgbG9hZFRzOiBEYXRlLm5vdygpLAog
IHV0bTogIiIsCiAgdXRtTWFwOiB7fQp9Owp2YXIgVE9UQUxfU1RFUFMgPSAxMjsKCi8qIC0tLS0tLS0tLS0gSEVMUEVSUyAtLS0tLS0tLS0tICovCmZ1bmN0aW9uICQoaWQpeyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyB9CmZ1bmN0aW9uIGVz
YyhzKXsgdmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7IGQudGV4dENvbnRlbnQ9KHM9PW51bGw/IiI6U3RyaW5nKHMpKTsgcmV0dXJuIGQuaW5uZXJIVE1MOyB9CmZ1bmN0aW9uIG1vbmV5KG4peyByZXR1cm4gIiQiKyhNYXRoLnJvdW5kKG4pKS50
b0xvY2FsZVN0cmluZygiZW4tVVMiKTsgfQpmdW5jdGlvbiByb3VuZDUwKG4peyByZXR1cm4gTWF0aC5yb3VuZChuLzUwKSo1MDsgfQpmdW5jdGlvbiBwYXJzZUFtdCh2KXsgdmFyIG49cGFyc2VGbG9hdChTdHJpbmcodikucmVwbGFjZSgvW14wLTkuXS9nLCIiKSk7
IHJldHVybiAoaXNGaW5pdGUobikmJm4+MCk/TWF0aC5yb3VuZChuKjEwMCkvMTAwOjA7IH0KZnVuY3Rpb24gdHJhY2soZXZ0LHBhcmFtcyl7CiAgdHJ5ewogICAgaWYodHlwZW9mIHdpbmRvdy5ndGFnPT09ImZ1bmN0aW9uIikgd2luZG93Lmd0YWcoImV2ZW50Iixl
dnQscGFyYW1zfHx7fSk7CiAgICBlbHNlIGlmKHdpbmRvdy5kYXRhTGF5ZXIpIHdpbmRvdy5kYXRhTGF5ZXIucHVzaChPYmplY3QuYXNzaWduKHtldmVudDpldnR9LHBhcmFtc3x8e30pKTsKICB9Y2F0Y2goZSl7fQp9CmZ1bmN0aW9uIHJhbmdlVGV4dChpdCl7CiAg
aWYoaXQubG93PT1udWxsKSByZXR1cm4gIiI7CiAgdmFyIG0gPSBNVUxUW3N0YXRlLmhkci5zdF0gfHwgMSwgc3VmZml4LCBsbywgaGk7CiAgbG8gPSByb3VuZDUwKGl0LmxvdyptKTsgaGkgPSByb3VuZDUwKGl0LmhpZ2gqbSk7CiAgc3VmZml4ID0gc3RhdGUuaGRy
LnN0ID8gKCJuYXRpb25hbCBwbGFubmluZyBlc3RpbWF0ZSBhZGp1c3RlZCBmb3IgIitzdGF0ZS5oZHIuc3QpIDogIm5hdGlvbmFsIHBsYW5uaW5nIGVzdGltYXRlIjsKICByZXR1cm4gIlR5cGljYWw6ICIrbW9uZXkobG8pKyIgXHUyMDEzICIrbW9uZXkoaGkpKyIg
KCIraXQuYmFzaXMrIikgXHUyMDE0ICIrc3VmZml4KyIgXHUyMDE0IHZlcmlmeSB3aXRoIHlvdXIgY29udHJhY3RvcnMiOwp9CmZ1bmN0aW9uIHN1YnRvdGFsKCl7CiAgdmFyIHM9MDsgZm9yKHZhciBrIGluIHN0YXRlLmFtb3VudHMpeyBpZigrayE9PTg4KSBzKz1z
dGF0ZS5hbW91bnRzW2tdfHwwOyB9IHJldHVybiBzOwp9CmZ1bmN0aW9uIGNvbnRpbmdlbmN5KCl7IHJldHVybiBzdGF0ZS5hbW91bnRzWzg4XXx8MDsgfQpmdW5jdGlvbiBncmFuZFRvdGFsKCl7IHJldHVybiBzdWJ0b3RhbCgpK2NvbnRpbmdlbmN5KCk7IH0KZnVu
Y3Rpb24gaXRlbUNvdW50KCl7IHZhciBjPTA7IGZvcih2YXIgayBpbiBzdGF0ZS5hbW91bnRzKXsgaWYoc3RhdGUuYW1vdW50c1trXT4wKSBjKys7IH0gcmV0dXJuIGM7IH0KCi8qIC0tLS0tLS0tLS0gTVVMVEktVU5JVCAoZWFjaCBwcm9wZXJ0eSB0eXBlIG1hcHMg
dG8gaXRzIFRlcm51cyBkcmF3IHRlbXBsYXRlOgogICBTRlIvQ29uZG8vVG93bmhvdXNlL1BVRCAtPiBTRlIgZm9ybWF0OyAyLTQgVW5pdHMgLT4gMS00IFVuaXQgZm9ybWF0IChVTklUIDEtNAogICBjb2x1bW5zICsgVE9UQUwpOyA1IFVuaXRzIC0+IDUgVW5pdCBm
b3JtYXQgKFVOSVQgMS01ICsgVE9UQUwpKSAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIHVuaXRDb3VudCgpewogIGlmKHN0YXRlLmhkci5wdHlwZT09PSIyLTQgVW5pdHMiKXsgdmFyIHU9cGFyc2VJbnQoc3RhdGUuaGRyLnVuaXRzLDEwKTsgcmV0dXJuICh1Pj0yJiZ1
PD00KT91OjI7IH0KICBpZihzdGF0ZS5oZHIucHR5cGU9PT0iNSBVbml0cyIpIHJldHVybiA1OwogIHJldHVybiAxOwp9CmZ1bmN0aW9uIHVuaXRTdW0oaWQpeyB2YXIgYT1zdGF0ZS51YW10c1tpZF18fFtdLCBzPTA7IGZvcih2YXIgaz0wO2s8YS5sZW5ndGg7aysr
KSBzKz1hW2tdfHwwOyByZXR1cm4gTWF0aC5yb3VuZChzKjEwMCkvMTAwOyB9CmZ1bmN0aW9uIHVuaXRTdWJ0b3RhbChrKXsgdmFyIHM9MDsgZm9yKHZhciBpZCBpbiBzdGF0ZS51YW10cyl7IGlmKCtpZCE9PTg4KSBzKz0oc3RhdGUudWFtdHNbaWRdW2tdfHwwKTsg
fSByZXR1cm4gTWF0aC5yb3VuZChzKjEwMCkvMTAwOyB9CmZ1bmN0aW9uIHN5bmNVbml0VG90YWxzKCl7CiAgaWYodW5pdENvdW50KCk8MikgcmV0dXJuOwogIGZvcih2YXIgaWQgaW4gc3RhdGUudWFtdHMpeyB2YXIgdD11bml0U3VtKGlkKTsgaWYodD4wKSBzdGF0
ZS5hbW91bnRzW2lkXT10OyBlbHNlIGRlbGV0ZSBzdGF0ZS5hbW91bnRzW2lkXTsgfQp9CmZ1bmN0aW9uIHNlZWRVbml0cygpeyAvKiBlbnRlcmluZyBhIG11bHRpLXVuaXQgdHlwZTogY2FycnkgZXhpc3Rpbmcgd2hvbGUtcHJvcGVydHkgdG90YWxzIGludG8gVW5p
dCAxICovCiAgaWYodW5pdENvdW50KCk8MikgcmV0dXJuOwogIGZvcih2YXIgayBpbiBzdGF0ZS5hbW91bnRzKXsgaWYoc3RhdGUuYW1vdW50c1trXT4wICYmIHVuaXRTdW0oayk8PTApIHN0YXRlLnVhbXRzW2tdPVtzdGF0ZS5hbW91bnRzW2tdXTsgfQp9CgovKiAt
LS0tLS0tLS0tIFJFTkRFUiAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIHJlbmRlclByb2dyZXNzKCl7CiAgdmFyIGg9IiI7CiAgZm9yKHZhciBpPTE7aTw9VE9UQUxfU1RFUFM7aSsrKSBoKz0nPHNwYW4gY2xhc3M9IicrKGk8c3RhdGUuc3RlcD8iZG9uZSI6KGk9PT1z
dGF0ZS5zdGVwPyJjdXIiOiIiKSkrJyI+PC9zcGFuPic7CiAgJCgidHJidFByb2dyZXNzIikuaW5uZXJIVE1MPWg7Cn0KZnVuY3Rpb24gaXRlbVJvdyhpdCl7CiAgdmFyIGFtdCA9IHN0YXRlLmFtb3VudHNbaXQuaWRdP3N0YXRlLmFtb3VudHNbaXQuaWRdOiIiOwog
IHZhciBkID0gc3RhdGUuZGVzY3NbaXQuaWRdfHwiIiwgbiA9IHVuaXRDb3VudCgpOwogIHZhciBhbXRIdG1sOwogIGlmKG4+MSl7CiAgICB2YXIgdWE9c3RhdGUudWFtdHNbaXQuaWRdfHxbXSwgaW5wdXRzPSIiOwogICAgZm9yKHZhciBrPTA7azxuO2srKykgaW5w
dXRzKz0nPGlucHV0IHR5cGU9InRleHQiIGlucHV0bW9kZT0iZGVjaW1hbCIgYXJpYS1sYWJlbD0iVW5pdCAnKyhrKzEpKycgYW1vdW50IGZvciAnK2VzYyhpdC5uYW1lKSsnIiBkYXRhLXVhbXQ9IicraXQuaWQrJzonK2srJyIgdmFsdWU9IicrKHVhW2tdP2VzYyh1
YVtrXSk6IiIpKyciIHBsYWNlaG9sZGVyPSJVbml0ICcrKGsrMSkrJyIgc3R5bGU9IndpZHRoOicrKG4+Mz8iNzBweCI6Ijg0cHgiKSsnIj4nOwogICAgYW10SHRtbD0nPGRpdiBjbGFzcz0idHJidC1hbXQiIHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjRweDtmbGV4
LXdyYXA6d3JhcCI+JytpbnB1dHMrJzwvZGl2Pic7CiAgfWVsc2V7CiAgICBhbXRIdG1sPSc8ZGl2IGNsYXNzPSJ0cmJ0LWFtdCI+PGlucHV0IHR5cGU9InRleHQiIGlucHV0bW9kZT0iZGVjaW1hbCIgYXJpYS1sYWJlbD0iQW1vdW50IGZvciAnK2VzYyhpdC5uYW1l
KSsnIiBkYXRhLWFtdD0iJytpdC5pZCsnIiB2YWx1ZT0iJysoYW10P2VzYyhhbXQpOiIiKSsnIiBwbGFjZWhvbGRlcj0iMCI+PC9kaXY+JzsKICB9CiAgcmV0dXJuICc8ZGl2IGNsYXNzPSJ0cmJ0LWl0ZW0iIGRhdGEtaXRlbT0iJytpdC5pZCsnIj4nKwogICAgJzxk
aXYgY2xhc3M9Im5tIj4nK2VzYyhpdC5uYW1lKSsnPGRpdiBjbGFzcz0idHJidC1yYW5nZSIgZGF0YS1yYW5nZT0iJytpdC5pZCsnIj4nK2VzYyhyYW5nZVRleHQoaXQpKSsnPC9kaXY+PC9kaXY+JysKICAgIGFtdEh0bWwrCiAgICAnPGRpdj48dGV4dGFyZWEgcm93
cz0iMiIgbWF4bGVuZ3RoPSIyMDAiIGRhdGEtZGVzYz0iJytpdC5pZCsnIiBwbGFjZWhvbGRlcj0iJytlc2MoaXQucGh8fCJEZXNjcmliZSB0aGUgd29yayBpbiBkZXRhaWwiKSsnIj4nK2VzYyhkKSsnPC90ZXh0YXJlYT48L2Rpdj4nKwogICc8L2Rpdj4nOwp9CmZ1
bmN0aW9uIGdyb3VwSHRtbChzZWMsIGcpewogIHZhciByZW1vZGVsT24gPSBnLnJlbW9kZWwgJiYgKHN0YXRlLmFtb3VudHNbZy5yZW1vZGVsXT4wKTsKICB2YXIgaCA9IGcubGFiZWwgPyAnPGgzIHN0eWxlPSJtYXJnaW4tdG9wOjE0cHgiPicrZXNjKGcubGFiZWwp
Kyc8L2gzPicgOiAiIjsKICBnLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oaWQpewogICAgdmFyIGl0PWJ5SWRbaWRdOwogICAgaWYoZy5yZW1vZGVsICYmIHJlbW9kZWxPbiAmJiBpZCE9PWcucmVtb2RlbCkgcmV0dXJuOyAvLyBjb2xsYXBzZWQKICAgIGgrPWl0ZW1S
b3coaXQpOwogIH0pOwogIGlmKGcucmVtb2RlbCl7CiAgICBpZihyZW1vZGVsT24pIGgrPSc8ZGl2IGNsYXNzPSJ0cmJ0LW5vdGUiPkZ1bGwgUmVtb2RlbCBpcyBzZXQsIHNvIHRoZSBpdGVtaXplZCBsaW5lcyBmb3IgdGhpcyByb29tIGFyZSBoaWRkZW4gdG8gYXZv
aWQgZG91YmxlIGNvdW50aW5nLiBDbGVhciB0aGUgRnVsbCBSZW1vZGVsIGFtb3VudCB0byBpdGVtaXplIGluc3RlYWQuPC9kaXY+JzsKICAgIGVsc2UgaCs9JzxkaXYgY2xhc3M9InRyYnQtbm90ZSI+RW50ZXIgRnVsbCBSZW1vZGVsIDxlbT5vcjwvZW0+IHRoZSBp
dGVtaXplZCBsaW5lcyBcdTIwMTQgbm90IGJvdGguIFNldHRpbmcgYSBGdWxsIFJlbW9kZWwgYW1vdW50IGhpZGVzIHRoZSBpdGVtaXplZCBsaW5lcyB0byBhdm9pZCBkb3VibGUgY291bnRpbmcuPC9kaXY+JzsKICB9CiAgcmV0dXJuIGg7Cn0KZnVuY3Rpb24gc3Rl
cDFIdG1sKCl7CiAgdmFyIGg9c3RhdGUuaGRyOwogIHZhciBzdE9wdHM9JzxvcHRpb24gdmFsdWU9IiI+U2VsZWN0XHUyMDI2PC9vcHRpb24+JytTVEFURVMubWFwKGZ1bmN0aW9uKHMpe3JldHVybiAnPG9wdGlvbicrKGguc3Q9PT1zPyIgc2VsZWN0ZWQiOiIiKSsn
PicrcysnPC9vcHRpb24+Jzt9KS5qb2luKCIiKTsKICByZXR1cm4gJzxkaXYgY2xhc3M9InRyYnQtY2FyZCI+JysKICAnPGRpdiBjbGFzcz0idHJidC1zdGVwbWV0YSI+U3RlcCAxIG9mIDEyPC9kaXY+PGgyPlByb2plY3QgJiBQcm9wZXJ0eTwvaDI+JysKICAnPHAg
c3R5bGU9ImZvbnQtc2l6ZToxNHB4O2NvbG9yOiM0YTVhNjg7bWFyZ2luOjJweCAwIDE2cHgiPkZpZWxkcyBtYXJrZWQgPHNwYW4gY2xhc3M9InJlcSI+Kjwvc3Bhbj4gYXJlIHJlcXVpcmVkIGJlZm9yZSB5b3UgY2FuIGRvd25sb2FkLiBZb3VyIHN0YXRlIHNldHMg
dGhlIGNvc3QgZ3VpZGFuY2Ugc2hvd24gdGhyb3VnaG91dC48L3A+JysKICAnPGRpdiBjbGFzcz0idHJidC1ncmlkIj4nKwogICc8ZGl2IGNsYXNzPSJ0cmJ0LWZpZWxkIj48bGFiZWw+UHJvcGVydHkgdHlwZTwvbGFiZWw+PHNlbGVjdCBpZD0iaFB0eXBlIj4nK1BU
WVBFUy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuICc8b3B0aW9uJysoaC5wdHlwZT09PXQ/IiBzZWxlY3RlZCI6IiIpKyc+Jyt0Kyc8L29wdGlvbj4nO30pLmpvaW4oIiIpKyc8L3NlbGVjdD48L2Rpdj4nKwogIChoLnB0eXBlPT09IjItNCBVbml0cyI/JzxkaXYgY2xh
c3M9InRyYnQtZmllbGQiPjxsYWJlbD5OdW1iZXIgb2YgdW5pdHM8L2xhYmVsPjxzZWxlY3QgaWQ9ImhVbml0cyI+JytbMiwzLDRdLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gJzxvcHRpb24nKyh1bml0Q291bnQoKT09PXU/IiBzZWxlY3RlZCI6IiIpKyc+Jyt1Kyc8
L29wdGlvbj4nO30pLmpvaW4oIiIpKyc8L3NlbGVjdD48L2Rpdj4nOiIiKSsKICAodW5pdENvdW50KCk+MT8nPGRpdiBjbGFzcz0idHJidC1maWVsZCBmdWxsIj48ZGl2IGNsYXNzPSJ0cmJ0LW5vdGUiPk11bHRpLXVuaXQgcHJvamVjdDogZWFjaCBsaW5lIGl0ZW0g
dGFrZXMgYW4gYW1vdW50IHBlciB1bml0LiBZb3VyIGZpbGVzIGV4cG9ydCBpbiB0aGUgVGVybnVzICcrKHVuaXRDb3VudCgpPT09NT8iNSBVbml0IjoiMS00IFVuaXQiKSsnIGRyYXcgZm9ybWF0IHdpdGggYSBjb2x1bW4gcGVyIHVuaXQuPC9kaXY+PC9kaXY+Jzoi
IikrCiAgJzxkaXYgY2xhc3M9InRyYnQtZmllbGQgZnVsbCI+PGxhYmVsPlByb3BlcnR5IHN0cmVldCBhZGRyZXNzIDxzcGFuIGNsYXNzPSJyZXEiPio8L3NwYW4+PC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImhBZGRyIiBtYXhsZW5ndGg9IjEyMCIgdmFs
dWU9IicrZXNjKGguYWRkcikrJyI+PC9kaXY+JysKICAnPGRpdiBjbGFzcz0idHJidC1maWVsZCI+PGxhYmVsPkNpdHkgPHNwYW4gY2xhc3M9InJlcSI+Kjwvc3Bhbj48L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaENpdHkiIG1heGxlbmd0aD0iNjAiIHZh
bHVlPSInK2VzYyhoLmNpdHkpKyciPjwvZGl2PicrCiAgJzxkaXYgY2xhc3M9InRyYnQtZmllbGQiIHN0eWxlPSJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjEwcHgiPjxzcGFuIGNsYXNzPSJ0cmJ0LWZpZWxkIj48bGFiZWw+
U3RhdGUgPHNwYW4gY2xhc3M9InJlcSI+Kjwvc3Bhbj48L2xhYmVsPjxzZWxlY3QgaWQ9ImhTdCI+JytzdE9wdHMrJzwvc2VsZWN0Pjwvc3Bhbj48c3BhbiBjbGFzcz0idHJidC1maWVsZCI+PGxhYmVsPlppcCA8c3BhbiBjbGFzcz0icmVxIj4qPC9zcGFuPjwvbGFi
ZWw+PGlucHV0IHR5cGU9InRleHQiIGlkPSJoWmlwIiBtYXhsZW5ndGg9IjEwIiBpbnB1dG1vZGU9Im51bWVyaWMiIHZhbHVlPSInK2VzYyhoLnppcCkrJyI+PC9zcGFuPjwvZGl2PicrCiAgJzxkaXYgY2xhc3M9InRyYnQtZmllbGQiPjxsYWJlbD5TcXVhcmUgZmVl
dCAoR0xBKSBcdTIwMTQgY3VycmVudCA8c3BhbiBjbGFzcz0icmVxIj4qPC9zcGFuPiAmcmFycjsgcmVoYWJiZWQ8L2xhYmVsPjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6OHB4Ij48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImhTcWZ0IiBtYXhsZW5ndGg9Ijci
IGlucHV0bW9kZT0ibnVtZXJpYyIgcGxhY2Vob2xkZXI9IkN1cnJlbnQiIHZhbHVlPSInK2VzYyhoLnNxZnQpKyciPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaFNxZnRSIiBtYXhsZW5ndGg9IjciIGlucHV0bW9kZT0ibnVtZXJpYyIgcGxhY2Vob2xkZXI9IlJlaGFi
YmVkIiB2YWx1ZT0iJytlc2MoaC5zcWZ0UikrJyI+PC9kaXY+PC9kaXY+JysKICAnPGRpdiBjbGFzcz0idHJidC1maWVsZCI+PGxhYmVsPlByb2plY3QgZHVyYXRpb24gKG1vbnRocyk8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaE1vbnRocyIgbWF4bGVu
Z3RoPSI0IiBpbnB1dG1vZGU9Im51bWVyaWMiIHZhbHVlPSInK2VzYyhoLm1vbnRocykrJyI+PC9kaXY+JysKICAnPGRpdiBjbGFzcz0idHJidC1maWVsZCI+PGxhYmVsPkJlZHJvb21zIFx1MjAxNCBjdXJyZW50ICZyYXJyOyByZWhhYmJlZDwvbGFiZWw+PGRpdiBz
dHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHgiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaEJlZHNDIiBtYXhsZW5ndGg9IjMiIGlucHV0bW9kZT0ibnVtZXJpYyIgcGxhY2Vob2xkZXI9IkN1cnJlbnQiIHZhbHVlPSInK2VzYyhoLmJlZHNDKSsnIj48aW5wdXQgdHlw
ZT0idGV4dCIgaWQ9ImhCZWRzUiIgbWF4bGVuZ3RoPSIzIiBpbnB1dG1vZGU9Im51bWVyaWMiIHBsYWNlaG9sZGVyPSJSZWhhYmJlZCIgdmFsdWU9IicrZXNjKGguYmVkc1IpKyciPjwvZGl2PjwvZGl2PicrCiAgJzxkaXYgY2xhc3M9InRyYnQtZmllbGQiPjxsYWJl
bD5CYXRocm9vbXMgXHUyMDE0IGN1cnJlbnQgJnJhcnI7IHJlaGFiYmVkPC9sYWJlbD48ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweCI+PGlucHV0IHR5cGU9InRleHQiIGlkPSJoQmF0aHNDIiBtYXhsZW5ndGg9IjQiIGlucHV0bW9kZT0ibnVtZXJpYyIg
cGxhY2Vob2xkZXI9IkN1cnJlbnQiIHZhbHVlPSInK2VzYyhoLmJhdGhzQykrJyI+PGlucHV0IHR5cGU9InRleHQiIGlkPSJoQmF0aHNSIiBtYXhsZW5ndGg9IjQiIGlucHV0bW9kZT0ibnVtZXJpYyIgcGxhY2Vob2xkZXI9IlJlaGFiYmVkIiB2YWx1ZT0iJytlc2Mo
aC5iYXRoc1IpKyciPjwvZGl2PjwvZGl2PicrCiAgJzxkaXYgY2xhc3M9InRyYnQtZmllbGQgZnVsbCI+PGxhYmVsPkRlc2NyaXB0aW9uIG9mIHdvcmsgKG5hcnJhdGl2ZSk8L2xhYmVsPjx0ZXh0YXJlYSBpZD0iaERlc2MiIHJvd3M9IjMiIG1heGxlbmd0aD0iMTUw
MCIgcGxhY2Vob2xkZXI9Ik5hcnJhdGl2ZSBvZiB0aGUgcmVoYWIgcmVxdWlyZWQuIERldGFpbCBhbnkgYWRkaXRpb25zLCBjb252ZXJzaW9ucywgb3IgcmVkZXNpZ25zIFx1MjAxNCBtb3JlIGRldGFpbCBzdXBwb3J0cyBhIGJldHRlciBBZnRlciBSZXBhaXIgVmFs
dWF0aW9uLiI+Jytlc2MoaC5kZXNjKSsnPC90ZXh0YXJlYT48L2Rpdj4nKwogICc8L2Rpdj48cCBjbGFzcz0idHJidC1lcnJub3RlIiBpZD0iaGRyRXJyIj5QbGVhc2UgY29tcGxldGUgdGhlIHJlcXVpcmVkIGZpZWxkcyAoYWRkcmVzcywgY2l0eSwgc3RhdGUsIHpp
cCwgc3F1YXJlIGZlZXQpLjwvcD48L2Rpdj4nOwp9CmZ1bmN0aW9uIHJldmlld0h0bWwoKXsKICB2YXIgcm93cz0iIiwgYW55PWZhbHNlLCBuPXVuaXRDb3VudCgpOwogIGZ1bmN0aW9uIGFtdENlbGwoaWQsIGEpewogICAgaWYobj4xKXsKICAgICAgdmFyIHVhPXN0
YXRlLnVhbXRzW2lkXXx8W10sIGlucHV0cz0iIjsKICAgICAgZm9yKHZhciBrPTA7azxuO2srKykgaW5wdXRzKz0nPGlucHV0IHR5cGU9InRleHQiIGlucHV0bW9kZT0iZGVjaW1hbCIgZGF0YS11YW10PSInK2lkKyc6JytrKyciIHZhbHVlPSInKyh1YVtrXXx8IiIp
KyciIHBsYWNlaG9sZGVyPSJVJysoaysxKSsnIiBzdHlsZT0id2lkdGg6NjRweCI+JzsKICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJ0cmJ0LWFtdCIgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6NHB4O2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDpmbGV4
LWVuZCI+JytpbnB1dHMrJzwvZGl2Pic7CiAgICB9CiAgICByZXR1cm4gJzxkaXYgY2xhc3M9InRyYnQtYW10Ij48aW5wdXQgdHlwZT0idGV4dCIgaW5wdXRtb2RlPSJkZWNpbWFsIiBkYXRhLXJhbXQ9IicraWQrJyIgdmFsdWU9IicrKGF8fCIiKSsnIj48L2Rpdj4n
OwogIH0KICBJVEVNUy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgIGlmKGl0LmlkPT09ODgpIHJldHVybjsKICAgIHZhciBhPXN0YXRlLmFtb3VudHNbaXQuaWRdfHwwOwogICAgaWYoYTw9MCAmJiAhKHN0YXRlLmRlc2NzW2l0LmlkXXx8IiIpKSByZXR1cm47CiAg
ICBhbnk9dHJ1ZTsKICAgIHJvd3MrPSc8dHI+PHRkPicraXQuaWQrJzwvdGQ+PHRkPicrZXNjKGl0Lm5hbWUpKyc8L3RkPicrCiAgICAgICc8dGQ+PGlucHV0IHR5cGU9InRleHQiIG1heGxlbmd0aD0iMjAwIiBkYXRhLXJkZXNjPSInK2l0LmlkKyciIHZhbHVlPSIn
K2VzYyhzdGF0ZS5kZXNjc1tpdC5pZF18fCIiKSsnIiBwbGFjZWhvbGRlcj0iJytlc2MoaXQucGh8fCIiKSsnIj48L3RkPicrCiAgICAgICc8dGQgY2xhc3M9Im51bSI+JythbXRDZWxsKGl0LmlkLCBhKSsnPC90ZD48L3RyPic7CiAgfSk7CiAgaWYoIWFueSkgcm93
cz0nPHRyPjx0ZCBjb2xzcGFuPSI0IiBzdHlsZT0iY29sb3I6IzViNmI3OCI+Tm8gaXRlbXMgZW50ZXJlZCB5ZXQuIEdvIGJhY2sgYW5kIGFkZCBhbW91bnRzIHRvIHlvdXIgcHJvamVjdCBzZWN0aW9ucy48L3RkPjwvdHI+JzsKICB2YXIgc3VnID0gcm91bmQ1MChz
dWJ0b3RhbCgpKjAuMTApOwogIGlmKCFzdGF0ZS5jb250TWFudWFsKXsKICAgIGlmKG4+MSl7CiAgICAgIHN0YXRlLnVhbXRzWzg4XT1zdGF0ZS51YW10c1s4OF18fFtdOwogICAgICBmb3IodmFyIHE9MDtxPG47cSsrKSBzdGF0ZS51YW10c1s4OF1bcV09cm91bmQ1
MCh1bml0U3VidG90YWwocSkqMC4xMCk7CiAgICAgIHZhciB0ODg9dW5pdFN1bSg4OCk7IGlmKHQ4OD4wKSBzdGF0ZS5hbW91bnRzWzg4XT10ODg7IGVsc2UgZGVsZXRlIHN0YXRlLmFtb3VudHNbODhdOwogICAgfWVsc2V7CiAgICAgIHN0YXRlLmFtb3VudHNbODhd
PXN1ZzsKICAgIH0KICB9CiAgdmFyIGNvbnQgPSBzdGF0ZS5hbW91bnRzWzg4XXx8MDsKICByZXR1cm4gJzxkaXYgY2xhc3M9InRyYnQtY2FyZCI+PGRpdiBjbGFzcz0idHJidC1zdGVwbWV0YSI+U3RlcCAxMiBvZiAxMjwvZGl2PjxoMj5SZXZpZXcgJiBDb250aW5n
ZW5jeTwvaDI+JysKICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxNHB4O2NvbG9yOiM0YTVhNjg7bWFyZ2luOjJweCAwIDE0cHgiPkVkaXQgYW55IGFtb3VudCBvciBkZXNjcmlwdGlvbiBpbmxpbmUuIFRoZW4gdW5sb2NrIHlvdXIgZG93bmxvYWRzLjwvcD4nKwogICc8
ZGl2IHN0eWxlPSJvdmVyZmxvdy14OmF1dG8iPjx0YWJsZSBjbGFzcz0idHJidC1yZXZpZXciPjx0aGVhZD48dHI+PHRoPklEPC90aD48dGg+RHJhdyBpdGVtPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjx0aCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+QW1vdW50
PC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Picrcm93cysnPC90Ym9keT48L3RhYmxlPjwvZGl2PicrCiAgJzxkaXYgY2xhc3M9InRyYnQtaXRlbSIgc3R5bGU9ImJvcmRlci10b3A6MnB4IHNvbGlkICNFQUYzRjY7bWFyZ2luLXRvcDoxMHB4Ij48ZGl2IGNsYXNzPSJu
bSI+ODggJm1pZGRvdDsgQ29udGluZ2VuY2llczxzbWFsbD5BdXRvLXN1Z2dlc3RlZCBhdCAxMCUgb2YgeW91ciBpdGVtcyBcdTIwMTQgZWRpdCBvciBzZXQgdG8gMC48L3NtYWxsPjwvZGl2PicrCiAgKG4+MT9hbXRDZWxsKDg4LCBjb250KTonPGRpdiBjbGFzcz0i
dHJidC1hbXQiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpbnB1dG1vZGU9ImRlY2ltYWwiIGlkPSJjb250QW10IiB2YWx1ZT0iJysoY29udHx8IiIpKyciIHBsYWNlaG9sZGVyPSIwIj48L2Rpdj4nKSsKICAnPGRpdiBzdHlsZT0iYWxpZ24tc2VsZjpjZW50ZXI7Zm9udC1z
aXplOjEzcHg7Y29sb3I6IzViNmI3OCI+U3VnZ2VzdGVkOiAnK21vbmV5KHN1ZykrJzwvZGl2PjwvZGl2PicrCiAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLXRv
cDoxNnB4O2ZsZXgtd3JhcDp3cmFwO2dhcDoxMHB4Ij4nKwogICc8ZGl2IHN0eWxlPSJmb250LXNpemU6MThweDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzI2M0E3RCI+VG90YWw6IDxzcGFuIGlkPSJyZXZUb3RhbCI+Jyttb25leShncmFuZFRvdGFsKCkpKyc8L3Nw
YW4+PC9kaXY+JysKICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDoxMHB4O2ZsZXgtd3JhcDp3cmFwIj48YnV0dG9uIGNsYXNzPSJ0cmJ0LWJ0biBnaG9zdCIgb25jbGljaz0iVFJCVC5jb3B5TGluayh0aGlzKSI+Q29weSBzaGFyZSBsaW5rPC9idXR0b24+
JysKICAnPGJ1dHRvbiBjbGFzcz0idHJidC1idG4iIG9uY2xpY2s9IlRSQlQub3BlbkdhdGUoKSI+Jysoc3RhdGUuc3VibWl0dGVkPyJET1dOTE9BRFMiOiJVTkxPQ0sgRE9XTkxPQURTIikrJzwvYnV0dG9uPjwvZGl2PjwvZGl2PicrCiAgJzxwIGNsYXNzPSJ0cmJ0
LWVycm5vdGUiIGlkPSJyZXZFcnIiPjwvcD48L2Rpdj4nOwp9CmZ1bmN0aW9uIHJlbmRlcigpewogIHJlbmRlclByb2dyZXNzKCk7CiAgdmFyIGhvc3Q9JCgidHJidFN0ZXBzIiksIGg9IiI7CiAgaWYoc3RhdGUuc3RlcD09PTEpeyBoPXN0ZXAxSHRtbCgpOyB9CiAg
ZWxzZSBpZihzdGF0ZS5zdGVwPT09MTIpeyBoPXJldmlld0h0bWwoKTsgfQogIGVsc2V7CiAgICB2YXIgc2VjID0gU0VDVElPTlNbc3RhdGUuc3RlcC0yXTsKICAgIHZhciBvbiA9IHNlYy50b2dnbGUgPyAoc3RhdGUudG9nZ2xlc1tzZWMua2V5XT09PXRydWUpIDog
dHJ1ZTsKICAgIGg9JzxkaXYgY2xhc3M9InRyYnQtY2FyZCI+PGRpdiBjbGFzcz0idHJidC1zdGVwbWV0YSI+U3RlcCAnK3NlYy5zdGVwKycgb2YgMTI8L2Rpdj48aDI+Jytlc2Moc2VjLnRpdGxlKSsnPC9oMj4nOwogICAgaWYoc2VjLm5vdGUpIGgrPSc8ZGl2IGNs
YXNzPSJ0cmJ0LW5vdGUiPicrZXNjKHNlYy5ub3RlKSsnPC9kaXY+JzsKICAgIGlmKHNlYy50b2dnbGUpewogICAgICBoKz0nPGRpdiBjbGFzcz0idHJidC10b2dnbGUiPjxwPicrZXNjKHNlYy50b2dnbGUpKyc8L3A+PHNwYW4gY2xhc3M9InRyYnQtc3dpdGNoIj4n
KwogICAgICAgICc8YnV0dG9uIGNsYXNzPSInKyhvbj8ib24iOiIiKSsnIiBvbmNsaWNrPSJUUkJULnNldFRvZ2dsZShcJycrc2VjLmtleSsnXCcsdHJ1ZSkiPlllczwvYnV0dG9uPicrCiAgICAgICAgJzxidXR0b24gY2xhc3M9IicrKCFvbiYmc3RhdGUudG9nZ2xl
c1tzZWMua2V5XT09PWZhbHNlPyJvbiI6IiIpKyciIG9uY2xpY2s9IlRSQlQuc2V0VG9nZ2xlKFwnJytzZWMua2V5KydcJyxmYWxzZSkiPk5vPC9idXR0b24+PC9zcGFuPjwvZGl2Pic7CiAgICB9CiAgICBpZihvbikgc2VjLmdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9u
KGcpeyBoKz1ncm91cEh0bWwoc2VjLGcpOyB9KTsKICAgIGgrPSc8L2Rpdj4nOwogIH0KICBoKz0nPGRpdiBjbGFzcz0idHJidC1uYXYiPicrCiAgICAoc3RhdGUuc3RlcD4xPyc8YnV0dG9uIGNsYXNzPSJ0cmJ0LWJ0biBnaG9zdCIgb25jbGljaz0iVFJCVC5wcmV2
KCkiPkJhY2s8L2J1dHRvbj4nOic8c3Bhbj48L3NwYW4+JykrCiAgICAoc3RhdGUuc3RlcDwxMj8nPGJ1dHRvbiBjbGFzcz0idHJidC1idG4iIG9uY2xpY2s9IlRSQlQubmV4dCgpIj5Db250aW51ZTwvYnV0dG9uPic6JzxzcGFuPjwvc3Bhbj4nKSsKICAnPC9kaXY+
JzsKICBob3N0LmlubmVySFRNTD1oOwogIGJpbmRJbnB1dHMoaG9zdCk7CiAgdXBkYXRlVG90YWwoKTsKICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDowLGJlaGF2aW9yOiJzbW9vdGgifSk7Cn0KZnVuY3Rpb24gYmluZElucHV0cyhob3N0KXsKICBob3N0LnF1ZXJ5U2Vs
ZWN0b3JBbGwoIltkYXRhLWFtdF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGlucCl7CiAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKCl7CiAgICAgIHZhciBpZD0raW5wLmdldEF0dHJpYnV0ZSgiZGF0YS1hbXQiKTsKICAgICAgc3RhdGUuYW1v
dW50c1tpZF09cGFyc2VBbXQoaW5wLnZhbHVlKTsKICAgICAgaWYoIXN0YXRlLnN0YXJ0VHJhY2tlZCl7IHN0YXRlLnN0YXJ0VHJhY2tlZD10cnVlOyB0cmFjaygicmVoYWJfd2l6YXJkX3N0YXJ0Iik7IH0KICAgICAgdXBkYXRlVG90YWwoKTsKICAgIH0pOwogICAg
aW5wLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLGZ1bmN0aW9uKCl7CiAgICAgIHZhciBpZD0raW5wLmdldEF0dHJpYnV0ZSgiZGF0YS1hbXQiKTsKICAgICAgaWYoc3RhdGUuYW1vdW50c1tpZF0pIGlucC52YWx1ZT1zdGF0ZS5hbW91bnRzW2lkXTsKICAgICAgLy8g
cmUtcmVuZGVyIG9ubHkgb24gYmx1ciBmb3IgcmVtb2RlbCBkcml2ZXJzIHNvIHR5cGluZyBpc24ndCBpbnRlcnJ1cHRlZAogICAgICB2YXIgaXNSZW1vZGVsRHJpdmVyPVNFQ1RJT05TLnNvbWUoZnVuY3Rpb24oc2VjKXtyZXR1cm4gc2VjLmdyb3Vwcy5zb21lKGZ1
bmN0aW9uKGcpe3JldHVybiBnLnJlbW9kZWw9PT1pZDt9KTt9KTsKICAgICAgaWYoaXNSZW1vZGVsRHJpdmVyKSByZW5kZXIoKTsKICAgIH0pOwogIH0pOwogIGhvc3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdWFtdF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGlucCl7
CiAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKCl7CiAgICAgIHZhciBwPWlucC5nZXRBdHRyaWJ1dGUoImRhdGEtdWFtdCIpLnNwbGl0KCI6IiksIGlkPStwWzBdLCBrPStwWzFdLCBuPXVuaXRDb3VudCgpOwogICAgICBpZighc3RhdGUu
dWFtdHNbaWRdKSBzdGF0ZS51YW10c1tpZF09W107CiAgICAgIHN0YXRlLnVhbXRzW2lkXVtrXT1wYXJzZUFtdChpbnAudmFsdWUpOwogICAgICB2YXIgdD11bml0U3VtKGlkKTsgaWYodD4wKSBzdGF0ZS5hbW91bnRzW2lkXT10OyBlbHNlIGRlbGV0ZSBzdGF0ZS5h
bW91bnRzW2lkXTsKICAgICAgaWYoaWQ9PT04OCl7IHN0YXRlLmNvbnRNYW51YWw9dHJ1ZTsgfQogICAgICBlbHNlIGlmKCFzdGF0ZS5jb250TWFudWFsICYmIHN0YXRlLnN0ZXA9PT0xMil7CiAgICAgICAgc3RhdGUudWFtdHNbODhdPXN0YXRlLnVhbXRzWzg4XXx8
W107CiAgICAgICAgZm9yKHZhciBxPTA7cTxuO3ErKyl7IHN0YXRlLnVhbXRzWzg4XVtxXT1yb3VuZDUwKHVuaXRTdWJ0b3RhbChxKSowLjEwKTsgdmFyIGNpPWhvc3QucXVlcnlTZWxlY3RvcignW2RhdGEtdWFtdD0iODg6JytxKyciXScpOyBpZihjaSkgY2kudmFs
dWU9c3RhdGUudWFtdHNbODhdW3FdfHwiIjsgfQogICAgICAgIHZhciB0ODg9dW5pdFN1bSg4OCk7IGlmKHQ4OD4wKSBzdGF0ZS5hbW91bnRzWzg4XT10ODg7IGVsc2UgZGVsZXRlIHN0YXRlLmFtb3VudHNbODhdOwogICAgICB9CiAgICAgIGlmKCFzdGF0ZS5zdGFy
dFRyYWNrZWQpeyBzdGF0ZS5zdGFydFRyYWNrZWQ9dHJ1ZTsgdHJhY2soInJlaGFiX3dpemFyZF9zdGFydCIpOyB9CiAgICAgIHZhciBydD0kKCJyZXZUb3RhbCIpOyBpZihydCkgcnQudGV4dENvbnRlbnQ9bW9uZXkoZ3JhbmRUb3RhbCgpKTsKICAgICAgdXBkYXRl
VG90YWwoKTsKICAgIH0pOwogICAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLGZ1bmN0aW9uKCl7CiAgICAgIHZhciBwPWlucC5nZXRBdHRyaWJ1dGUoImRhdGEtdWFtdCIpLnNwbGl0KCI6IiksIGlkPStwWzBdLCBrPStwWzFdOwogICAgICBpZihzdGF0ZS51
YW10c1tpZF0mJnN0YXRlLnVhbXRzW2lkXVtrXSkgaW5wLnZhbHVlPXN0YXRlLnVhbXRzW2lkXVtrXTsKICAgICAgdmFyIGlzUmVtb2RlbERyaXZlcj1TRUNUSU9OUy5zb21lKGZ1bmN0aW9uKHNlYyl7cmV0dXJuIHNlYy5ncm91cHMuc29tZShmdW5jdGlvbihnKXty
ZXR1cm4gZy5yZW1vZGVsPT09aWQ7fSk7fSk7CiAgICAgIGlmKGlzUmVtb2RlbERyaXZlcikgcmVuZGVyKCk7CiAgICB9KTsKICB9KTsKICBob3N0LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWRlc2NdIikuZm9yRWFjaChmdW5jdGlvbih0KXsKICAgIHQuYWRkRXZl
bnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKCl7IHN0YXRlLmRlc2NzWyt0LmdldEF0dHJpYnV0ZSgiZGF0YS1kZXNjIildPXQudmFsdWUuc2xpY2UoMCwyMDApOyBpZih0LnZhbHVlLnRyaW0oKSkgdC5jbGFzc0xpc3QucmVtb3ZlKCJlcnIiKTsgfSk7CiAgfSk7
CiAgaG9zdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1yYW10XSIpLmZvckVhY2goZnVuY3Rpb24oaW5wKXsKICAgIGlucC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsZnVuY3Rpb24oKXsKICAgICAgc3RhdGUuYW1vdW50c1sraW5wLmdldEF0dHJpYnV0ZSgiZGF0
YS1yYW10IildPXBhcnNlQW10KGlucC52YWx1ZSk7CiAgICAgIGlmKCFzdGF0ZS5jb250TWFudWFsKXsgc3RhdGUuYW1vdW50c1s4OF09cm91bmQ1MChzdWJ0b3RhbCgpKjAuMTApOyB2YXIgYz0kKCJjb250QW10Iik7IGlmKGMpIGMudmFsdWU9c3RhdGUuYW1vdW50
c1s4OF18fCIiOyB9CiAgICAgIHZhciBydD0kKCJyZXZUb3RhbCIpOyBpZihydCkgcnQudGV4dENvbnRlbnQ9bW9uZXkoZ3JhbmRUb3RhbCgpKTsKICAgICAgdXBkYXRlVG90YWwoKTsKICAgIH0pOwogIH0pOwogIGhvc3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEt
cmRlc2NdIikuZm9yRWFjaChmdW5jdGlvbih0KXsKICAgIHQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKCl7IHN0YXRlLmRlc2NzWyt0LmdldEF0dHJpYnV0ZSgiZGF0YS1yZGVzYyIpXT10LnZhbHVlLnNsaWNlKDAsMjAwKTsgaWYodC52YWx1ZS50
cmltKCkpIHQuY2xhc3NMaXN0LnJlbW92ZSgiZXJyIik7IH0pOwogIH0pOwogIHZhciBjb250PSQoImNvbnRBbXQiKTsKICBpZihjb250KSBjb250LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixmdW5jdGlvbigpewogICAgc3RhdGUuY29udE1hbnVhbD10cnVlOyBz
dGF0ZS5hbW91bnRzWzg4XT1wYXJzZUFtdChjb250LnZhbHVlKTsKICAgIHZhciBydD0kKCJyZXZUb3RhbCIpOyBpZihydCkgcnQudGV4dENvbnRlbnQ9bW9uZXkoZ3JhbmRUb3RhbCgpKTsKICAgIHVwZGF0ZVRvdGFsKCk7CiAgfSk7CiAgLy8gaGVhZGVyIGJpbmRp
bmdzCiAgW1siaEFkZHIiLCJhZGRyIl0sWyJoQ2l0eSIsImNpdHkiXSxbImhaaXAiLCJ6aXAiXSxbImhTcWZ0Iiwic3FmdCJdLFsiaFNxZnRSIiwic3FmdFIiXSxbImhNb250aHMiLCJtb250aHMiXSxbImhCZWRzQyIsImJlZHNDIl0sWyJoQmVkc1IiLCJiZWRzUiJd
LFsiaEJhdGhzQyIsImJhdGhzQyJdLFsiaEJhdGhzUiIsImJhdGhzUiJdLFsiaERlc2MiLCJkZXNjIl1dLmZvckVhY2goZnVuY3Rpb24ocCl7CiAgICB2YXIgZWw9JChwWzBdKTsgaWYoZWwpIGVsLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixmdW5jdGlvbigpeyBz
dGF0ZS5oZHJbcFsxXV09ZWwudmFsdWU7IH0pOwogIH0pOwogIHZhciB6cD0kKCJoWmlwIik7CiAgaWYoenApIHpwLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixmdW5jdGlvbigpewogICAgdmFyIHM9c3RGcm9tWmlwKHpwLnZhbHVlKTsKICAgIGlmKHMgJiYgcyE9
PXN0YXRlLmhkci5zdCl7IHN0YXRlLmhkci5zdD1zOyB2YXIgc2VsPSQoImhTdCIpOyBpZihzZWwpIHNlbC52YWx1ZT1zOyB9CiAgfSk7CiAgdmFyIHN0PSQoImhTdCIpOyBpZihzdCkgc3QuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixmdW5jdGlvbigpeyBzdGF0
ZS5oZHIuc3Q9c3QudmFsdWU7IHJlbmRlcigpOyB9KTsKICB2YXIgcHQ9JCgiaFB0eXBlIik7IGlmKHB0KSBwdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7IHN0YXRlLmhkci5wdHlwZT1wdC52YWx1ZTsgc2VlZFVuaXRzKCk7IHN5bmNVbml0
VG90YWxzKCk7IHJlbmRlcigpOyB9KTsKICB2YXIgdW49JCgiaFVuaXRzIik7IGlmKHVuKSB1bi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7IHN0YXRlLmhkci51bml0cz1wYXJzZUludCh1bi52YWx1ZSwxMCl8fDI7IHN5bmNVbml0VG90YWxz
KCk7IHJlbmRlcigpOyB9KTsKfQpmdW5jdGlvbiB1cGRhdGVUb3RhbCgpewogICQoInRyYnRUb3RhbCIpLnRleHRDb250ZW50PW1vbmV5KGdyYW5kVG90YWwoKSk7CiAgdmFyIGM9aXRlbUNvdW50KCk7CiAgJCgidHJidEl0ZW1Db3VudCIpLnRleHRDb250ZW50PSJc
dTAwYjcgIitjKyIgaXRlbSIrKGM9PT0xPyIiOiJzIik7Cn0KCi8qIC0tLS0tLS0tLS0gTkFWIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gbWlzc2luZ0Rlc2NJZHMoaWRzKXsKICB2YXIgb3V0PVtdOyBpZHMuZm9yRWFjaChmdW5jdGlvbihpZCl7IGlmKGlkIT09ODgg
JiYgKHN0YXRlLmFtb3VudHNbaWRdfHwwKT4wICYmICEoKHN0YXRlLmRlc2NzW2lkXXx8IiIpLnRyaW0oKSkpIG91dC5wdXNoKGlkKTsgfSk7CiAgcmV0dXJuIG91dDsKfQpmdW5jdGlvbiBzZWN0aW9uTWlzc2luZygpewogIGlmKHN0YXRlLnN0ZXA8Mnx8c3RhdGUu
c3RlcD4xMSkgcmV0dXJuIFtdOwogIHZhciBzZWM9U0VDVElPTlNbc3RhdGUuc3RlcC0yXSwgaWRzPVtdOwogIHNlYy5ncm91cHMuZm9yRWFjaChmdW5jdGlvbihnKXsgaWRzPWlkcy5jb25jYXQoZy5pdGVtcyk7IH0pOwogIHJldHVybiBtaXNzaW5nRGVzY0lkcyhp
ZHMpOwp9CmZ1bmN0aW9uIGZsYWdNaXNzaW5nKG1pc3MpewogIG1pc3MuZm9yRWFjaChmdW5jdGlvbihpZCl7IHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRlc2M9IicraWQrJyJdLCBbZGF0YS1yZGVzYz0iJytpZCsnIl0nKTsgaWYodCkgdC5j
bGFzc0xpc3QuYWRkKCJlcnIiKTsgfSk7Cn0KZnVuY3Rpb24gbmV4dCgpewogIGlmKHN0YXRlLnN0ZXA9PT0xICYmICFzdGF0ZS5zdGFydFRyYWNrZWQpeyBzdGF0ZS5zdGFydFRyYWNrZWQ9dHJ1ZTsgdHJhY2soInJlaGFiX3dpemFyZF9zdGFydCIpOyB9CiAgdmFy
IG1pc3M9c2VjdGlvbk1pc3NpbmcoKTsKICBpZihtaXNzLmxlbmd0aCl7CiAgICB2YXIgaG9zdD0kKCJ0cmJ0U3RlcHMiKTsKICAgIHZhciB3PWhvc3QucXVlcnlTZWxlY3RvcigiLnRyYnQtd2FybiIpOwogICAgaWYoIXcpeyB3PWRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoImRpdiIpOyB3LmNsYXNzTmFtZT0idHJidC13YXJuIjsgdmFyIGNhcmQ9aG9zdC5xdWVyeVNlbGVjdG9yKCIudHJidC1jYXJkIik7IGlmKGNhcmQpIGNhcmQuaW5zZXJ0QmVmb3JlKHcsIGNhcmQuZmlyc3RDaGlsZCk7IH0KICAgIGlmKHcpIHcudGV4dENvbnRl
bnQ9IkVhY2ggbGluZSBpdGVtIHdpdGggYSBkb2xsYXIgYW1vdW50IG5lZWRzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHdvcmsuIFBsZWFzZSBkZXNjcmliZSB0aGUgaGlnaGxpZ2h0ZWQgaXRlbSIrKG1pc3MubGVuZ3RoPjE/InMiOiIiKSsiIHNvIHRoZSBk
cmF3IHByb2Nlc3MgY2FuIHVzZSB5b3VyIGJ1ZGdldC4iOwogICAgZmxhZ01pc3NpbmcobWlzcyk7CiAgICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDowLGJlaGF2aW9yOiJzbW9vdGgifSk7CiAgICByZXR1cm47CiAgfQogIGlmKHN0YXRlLnN0ZXA8VE9UQUxfU1RFUFMp
eyBzdGF0ZS5zdGVwKys7IHRyYWNrKCJyZWhhYl9zdGVwX2FkdmFuY2UiLHtzdGVwOnN0YXRlLnN0ZXB9KTsgcmVuZGVyKCk7IH0KfQpmdW5jdGlvbiBwcmV2KCl7IGlmKHN0YXRlLnN0ZXA+MSl7IHN0YXRlLnN0ZXAtLTsgcmVuZGVyKCk7IH0gfQpmdW5jdGlvbiBz
ZXRUb2dnbGUoa2V5LHZhbCl7CiAgc3RhdGUudG9nZ2xlc1trZXldPXZhbDsKICBpZighdmFsKXsgLy8gIk5vIiBjbGVhcnMgdGhhdCBzZWN0aW9uJ3MgYW1vdW50cyBzbyB0aGUgdG90YWwgc3RheXMgaG9uZXN0CiAgICB2YXIgc2VjPW51bGw7CiAgICBTRUNUSU9O
Uy5mb3JFYWNoKGZ1bmN0aW9uKHMpeyBpZihzLmtleT09PWtleSkgc2VjPXM7IH0pOwogICAgaWYoc2VjKSBzZWMuZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24oZyl7IGcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpZCl7IGRlbGV0ZSBzdGF0ZS5hbW91bnRzW2lkXTsg
ZGVsZXRlIHN0YXRlLnVhbXRzW2lkXTsgfSk7IH0pOwogIH0KICByZW5kZXIoKTsKfQoKLyogLS0tLS0tLS0tLSBSRVFVSVJFRC1GSUVMRCBDSEVDSyAmIEdBVEUgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiBoZHJWYWxpZCgpewogIHZhciBoPXN0YXRlLmhkcjsKICBy
ZXR1cm4gISEoaC5hZGRyLnRyaW0oKSYmaC5jaXR5LnRyaW0oKSYmaC5zdCYmaC56aXAudHJpbSgpJiZTdHJpbmcoaC5zcWZ0KS50cmltKCkpOwp9CmZ1bmN0aW9uIG9wZW5HYXRlKCl7CiAgaWYoIWhkclZhbGlkKCkpewogICAgdmFyIGU9JCgicmV2RXJyIik7IGlm
KGUpeyBlLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjsgZS50ZXh0Q29udGVudD0iUHJvcGVydHkgYWRkcmVzcywgY2l0eSwgc3RhdGUsIHppcCwgYW5kIHNxdWFyZSBmZWV0IGFyZSByZXF1aXJlZCBiZWZvcmUgZG93bmxvYWQuIFRha2luZyB5b3UgdG8gU3RlcCAxLiI7
IH0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgc3RhdGUuc3RlcD0xOyByZW5kZXIoKTsgdmFyIGVsPSQoImhkckVyciIpOyBpZihlbCkgZWwuc3R5bGUuZGlzcGxheT0iYmxvY2siOyB9LDkwMCk7CiAgICByZXR1cm47CiAgfQogIHZhciBtaXNzQWxsPW1pc3Np
bmdEZXNjSWRzKE9iamVjdC5rZXlzKHN0YXRlLmFtb3VudHMpLm1hcChOdW1iZXIpKTsKICBpZihtaXNzQWxsLmxlbmd0aCl7CiAgICB2YXIgZTI9JCgicmV2RXJyIik7IGlmKGUyKXsgZTIuc3R5bGUuZGlzcGxheT0iYmxvY2siOyBlMi50ZXh0Q29udGVudD0iUGxl
YXNlIGFkZCBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciBldmVyeSBsaW5lIGl0ZW0gd2l0aCBhIGRvbGxhciBhbW91bnQgKGhpZ2hsaWdodGVkKSBzbyB0aGUgZHJhdyBwcm9jZXNzIGNhbiB1c2UgeW91ciBidWRnZXQuIjsgfQogICAgZmxhZ01pc3NpbmcobWlzc0Fs
bCk7CiAgICByZXR1cm47CiAgfQogIHRyYWNrKCJyZWhhYl9nYXRlX3Nob3duIik7CiAgJCgidHJidEdhdGUiKS5jbGFzc0xpc3QuYWRkKCJvcGVuIik7CiAgaWYoc3RhdGUuc3VibWl0dGVkKXsgJCgidHJidEdhdGVGb3JtIikuY2xhc3NMaXN0LmFkZCgidHJidC1o
aWRkZW4iKTsgJCgidHJidEdhdGVEb25lIikuY2xhc3NMaXN0LnJlbW92ZSgidHJidC1oaWRkZW4iKTsgfQp9CmZ1bmN0aW9uIGNsb3NlR2F0ZSgpeyAkKCJ0cmJ0R2F0ZSIpLmNsYXNzTGlzdC5yZW1vdmUoIm9wZW4iKTsgfQpmdW5jdGlvbiBzdWJtaXRHYXRlKCl7
CiAgdmFyIGZpcnN0PSQoImdGaXJzdCIpLnZhbHVlLnRyaW0oKSwgbGFzdD0kKCJnTGFzdCIpLnZhbHVlLnRyaW0oKSwKICAgICAgZW1haWw9JCgiZ0VtYWlsIikudmFsdWUudHJpbSgpLCBwaG9uZT0kKCJnUGhvbmUiKS52YWx1ZS50cmltKCk7CiAgdmFyIGVycj0k
KCJnRXJyIik7CiAgZnVuY3Rpb24gZmFpbChtc2cpeyBlcnIuc3R5bGUuZGlzcGxheT0iYmxvY2siOyBlcnIudGV4dENvbnRlbnQ9bXNnOyB9CiAgaWYoJCgiZ0NvbXBhbnkiKS52YWx1ZSl7IGZhaWwoIlN1Ym1pc3Npb24gZmFpbGVkLiBQbGVhc2UgcmVhY2ggdXMg
dGhyb3VnaCB0ZXJudXMuY29tL2NvbnRhY3QgaW5zdGVhZC4iKTsgcmV0dXJuOyB9CiAgaWYoIWZpcnN0fHwhbGFzdHx8IS9eW15AXHNdK0BbXkBcc10rXC5bXkBcc10rJC8udGVzdChlbWFpbCkpewogICAgZmFpbCgiUGxlYXNlIGVudGVyIHlvdXIgZmlyc3QgYW5k
IGxhc3QgbmFtZSBhbmQgYSB2YWxpZCBlbWFpbC4iKTsgcmV0dXJuOwogIH0KICB2YXIgcGhkPXBob25lLnJlcGxhY2UoL1xEL2csIiIpOwogIGlmKHBoZC5sZW5ndGg9PT0xMSYmcGhkLmNoYXJBdCgwKT09PSIxIikgcGhkPXBoZC5zbGljZSgxKTsKICBpZihwaGQu
bGVuZ3RoIT09MTApeyBmYWlsKCJQbGVhc2UgZW50ZXIgYSB2YWxpZCAxMC1kaWdpdCBVUyBwaG9uZSBudW1iZXIuIik7IHJldHVybjsgfQogIHBob25lPXBoZDsKICBpZighJCgiZ1NtcyIpLmNoZWNrZWR8fCEkKCJnRW1haWxDIikuY2hlY2tlZCl7CiAgICBmYWls
KCJCb3RoIGNvbnNlbnQgYm94ZXMgYXJlIHJlcXVpcmVkIHNvIHdlIGNhbiBzZW5kIHlvdXIgZWRpdCBsaW5rIGFuZCBmb2xsb3cgdXAgb24geW91ciBwcm9qZWN0LiIpOyByZXR1cm47CiAgfQogIGlmKERhdGUubm93KCktc3RhdGUubG9hZFRzPDE1MDAwKXsgZmFp
bCgiUGxlYXNlIHRha2UgYSBtb21lbnQgdG8gcmV2aWV3IHlvdXIgYnVkZ2V0LCB0aGVuIHN1Ym1pdCBhZ2Fpbi4iKTsgcmV0dXJuOyB9CiAgZXJyLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogIHZhciBidG49JCgiZ1N1Ym1pdCIpOyBidG4uZGlzYWJsZWQ9dHJ1ZTsg
YnRuLnRleHRDb250ZW50PSJTVUJNSVRUSU5HXHUyMDI2IjsKICBmdW5jdGlvbiByZXN0b3JlKCl7IGJ0bi5kaXNhYmxlZD1mYWxzZTsgYnRuLnRleHRDb250ZW50PSJVTkxPQ0sgTVkgQlVER0VUIjsgfQogIGxvYWRTY3JpcHQoTFpfVVJMKS50aGVuKGZ1bmN0aW9u
KCl7CiAgICB2YXIgaD1zdGF0ZS5oZHI7CiAgICB2YXIgZWRpdFVybD1sb2NhdGlvbi5vcmlnaW4rbG9jYXRpb24ucGF0aG5hbWUrIiNiPSIrTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCgpKSk7CiAg
ICB2YXIgc3VtbWFyeT0iUmVoYWIgQnVkZ2V0IFRvb2wgbGVhZCB8ICIraC5hZGRyKyIsICIraC5jaXR5KyIsICIraC5zdCsiICIraC56aXArIiB8ICIraC5wdHlwZSsodW5pdENvdW50KCk+MT8iICgiK3VuaXRDb3VudCgpKyIgdW5pdHMpIjoiIikrIiB8ICIraC5z
cWZ0KyhoLnNxZnRSPyIgLT4gIitoLnNxZnRSOiIiKSsiIHNxIGZ0IHwgVG90YWw6ICIrbW9uZXkoZ3JhbmRUb3RhbCgpKSsiICgiK2l0ZW1Db3VudCgpKyIgaXRlbXMpIisoaC5tb250aHM/IiB8ICIraC5tb250aHMrIiBtb250aHMiOiIiKSsoc3RhdGUudXRtPyIg
fCAiK3N0YXRlLnV0bToiIik7CiAgICB2YXIgYm9keT17fTsKICAgIGJvZHlbQ09ORklHLkZJRUxEUy5maXJzdF09Zmlyc3Q7CiAgICBib2R5W0NPTkZJRy5GSUVMRFMubGFzdF09bGFzdDsKICAgIGJvZHlbQ09ORklHLkZJRUxEUy5lbWFpbF09ZW1haWw7CiAgICBi
b2R5W0NPTkZJRy5GSUVMRFMucGhvbmVdPXBob25lOwogICAgYm9keVtDT05GSUcuRklFTERTLnNtc0NvbnNlbnRdPSIxIjsKICAgIGJvZHlbQ09ORklHLkZJRUxEUy5lbWFpbENvbnNlbnRdPSIxIjsKICAgIGJvZHlbImlucHV0XzhfMiJdPSJJIGFncmVlIHRvIHJl
Y2VpdmUgU01TL3RleHQgYW5kIHBob25lIGNvbW11bmljYXRpb25zIGZyb20gVGVybnVzIExlbmRpbmcgTExDLiI7CiAgICBib2R5WyJpbnB1dF85XzIiXT0iSSBhZ3JlZSB0byByZWNlaXZlIGVtYWlsIGNvbW11bmljYXRpb25zIGZyb20gVGVybnVzIExlbmRpbmcg
TExDLiI7CiAgICBpZihDT05GSUcuRklFTERTLmxlYWRTb3VyY2UpIGJvZHlbQ09ORklHLkZJRUxEUy5sZWFkU291cmNlXT1DT05GSUcuTEVBRF9TT1VSQ0U7CiAgICBib2R5WyJpbnB1dF81XzEiXT1oLmFkZHI7IGJvZHlbImlucHV0XzVfMyJdPWguY2l0eTsgYm9k
eVsiaW5wdXRfNV80Il09aC5zdDsgYm9keVsiaW5wdXRfNV81Il09aC56aXA7CiAgICBib2R5WyJpbnB1dF8xMCJdPVN0cmluZyhoLnNxZnR8fCIiKTsgYm9keVsiaW5wdXRfMTEiXT1TdHJpbmcoaC5tb250aHN8fCIiKTsKICAgIGJvZHlbImlucHV0XzEyIl09U3Ry
aW5nKGdyYW5kVG90YWwoKSk7IGJvZHlbImlucHV0XzEzIl09U3RyaW5nKGl0ZW1Db3VudCgpKTsKICAgIGlmKENPTkZJRy5GSUVMRFMuc3VtbWFyeSkgYm9keVtDT05GSUcuRklFTERTLnN1bW1hcnldPXN1bW1hcnk7CiAgICBpZihDT05GSUcuRklFTERTLmVkaXRM
aW5rKSBib2R5W0NPTkZJRy5GSUVMRFMuZWRpdExpbmtdPWVkaXRVcmw7CiAgICBmb3IodmFyIGsgaW4gQ09ORklHLlVUTV9GSUVMRFMpeyBpZihzdGF0ZS51dG1NYXBba10pIGJvZHlbQ09ORklHLlVUTV9GSUVMRFNba11dPXN0YXRlLnV0bU1hcFtrXTsgfQogICAg
cmV0dXJuIGZldGNoKENPTkZJRy5HRl9FTkRQT0lOVCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoYm9keSl9KQogICAgICAudGhlbihmdW5jdGlvbihyKXsgcmV0dXJu
IHIuanNvbigpLnRoZW4oZnVuY3Rpb24oZCl7IHJldHVybiB7b2s6ci5vayxkOmR9OyB9KTsgfSk7CiAgfSkudGhlbihmdW5jdGlvbihyZXMpewogICAgcmVzdG9yZSgpOwogICAgaWYocmVzJiZyZXMub2smJnJlcy5kJiZyZXMuZC5pc192YWxpZCl7CiAgICAgIHN0
YXRlLnN1Ym1pdHRlZD10cnVlOwogICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgidHJidF9sZWFkX2RvbmUiLCIxIik7CiAgICAgIHRyYWNrKCJyZWhhYl9sZWFkX3N1Ym1pdHRlZCIse3ZhbHVlOmdyYW5kVG90YWwoKSxpdGVtczppdGVtQ291bnQoKX0pOwogICAg
ICAkKCJ0cmJ0R2F0ZUZvcm0iKS5jbGFzc0xpc3QuYWRkKCJ0cmJ0LWhpZGRlbiIpOwogICAgICAkKCJ0cmJ0R2F0ZURvbmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJ0cmJ0LWhpZGRlbiIpOwogICAgfWVsc2V7CiAgICAgIHZhciBtc2c9IiI7CiAgICAgIGlmKHJlcyYm
cmVzLmQmJnJlcy5kLnZhbGlkYXRpb25fbWVzc2FnZXMpeyBmb3IodmFyIGsyIGluIHJlcy5kLnZhbGlkYXRpb25fbWVzc2FnZXMpeyBtc2c9cmVzLmQudmFsaWRhdGlvbl9tZXNzYWdlc1trMl07IGJyZWFrOyB9IH0KICAgICAgdHJhY2soInJlaGFiX2xlYWRfc3Vi
bWl0X2ZhaWxlZCIpOwogICAgICBmYWlsKG1zZ3x8IldlIGNvdWxkIG5vdCBzdWJtaXQgeW91ciBpbmZvIHJpZ2h0IG5vdy4gUGxlYXNlIHRyeSBhZ2Fpbiwgb3IgcmVhY2ggdXMgdGhyb3VnaCB0ZXJudXMuY29tL2NvbnRhY3QuIik7CiAgICB9CiAgfSkuY2F0Y2go
ZnVuY3Rpb24oKXsKICAgIHJlc3RvcmUoKTsKICAgIHRyYWNrKCJyZWhhYl9sZWFkX3N1Ym1pdF9mYWlsZWQiKTsKICAgIGZhaWwoIldlIGNvdWxkIG5vdCBzdWJtaXQgeW91ciBpbmZvIHJpZ2h0IG5vdy4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdh
aW4sIG9yIHJlYWNoIHVzIHRocm91Z2ggdGVybnVzLmNvbS9jb250YWN0LiIpOwogIH0pOwp9CmZ1bmN0aW9uIGZpbmlzaCgpeyB3aW5kb3cubG9jYXRpb24uaHJlZj1DT05GSUcuVEhBTktfWU9VX1VSTDsgfQoKLyogLS0tLS0tLS0tLSBMQVpZIExJQlJBUklFUyAo
bG9hZGVkIG9ubHkgYXQgZXhwb3J0L3NoYXJlIHRpbWUpIC0tLS0tLS0tLS0gKi8KdmFyIExaX1VSTD0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbHotc3RyaW5nLzEuNS4wL2x6LXN0cmluZy5taW4uanMiOwp2YXIgWExTWF9VUkw9Imh0
dHBzOi8vY2RuLnNoZWV0anMuY29tL3hsc3gtMC4yMC4zL3BhY2thZ2UvZGlzdC94bHN4LmZ1bGwubWluLmpzIjsKdmFyIEpTUERGX1VSTD0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanNwZGYvMi41LjEvanNwZGYudW1kLm1pbi5qcyI7
CnZhciBBVVRPVEFCTEVfVVJMPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi1hdXRvdGFibGUvMy44LjQvanNwZGYucGx1Z2luLmF1dG90YWJsZS5taW4uanMiOwp2YXIgbG9hZGVkPXt9OwpmdW5jdGlvbiBsb2FkU2NyaXB0KHVy
bCl7CiAgcmV0dXJuIGxvYWRlZFt1cmxdIHx8IChsb2FkZWRbdXJsXT1uZXcgUHJvbWlzZShmdW5jdGlvbihyZXMscmVqKXsKICAgIHZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOyBzLnNyYz11cmw7IHMub25sb2FkPXJlczsgcy5vbmVycm9y
PWZ1bmN0aW9uKCl7IGRlbGV0ZSBsb2FkZWRbdXJsXTsgcmVqKG5ldyBFcnJvcigibG9hZCBmYWlsZWQ6ICIrdXJsKSk7IH07CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogIH0pKTsKfQoKLyogLS0tLS0tLS0tLSBTSEFSRSBVUkwgKExaLXN0cmlu
ZzsgUElJIGV4Y2x1ZGVkIGJ5IGJ1aWxkIHJ1bGUpIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gcGF5bG9hZCgpewogIC8qIEJ1ZGdldCArIHByb3BlcnR5IGhlYWRlciBvbmx5LiBORVZFUiBuYW1lLCBlbWFpbCwgcGhvbmUsIG9yIGJvcnJvd2VyIG5hbWUuICovCiAg
dmFyIGl0ZW1zPXt9LCBuPXVuaXRDb3VudCgpOwogIGZvcih2YXIgayBpbiBzdGF0ZS5hbW91bnRzKXsKICAgIGlmKHN0YXRlLmFtb3VudHNba10+MHx8c3RhdGUuZGVzY3Nba10pewogICAgICBpdGVtc1trXT1bc3RhdGUuYW1vdW50c1trXXx8MCwgKHN0YXRlLmRl
c2NzW2tdfHwiIikuc2xpY2UoMCwyMDApXTsKICAgICAgaWYobj4xJiZzdGF0ZS51YW10c1trXSkgaXRlbXNba10ucHVzaChzdGF0ZS51YW10c1trXS5zbGljZSgwLG4pKTsKICAgIH0KICB9CiAgdmFyIGg9c3RhdGUuaGRyOwogIHJldHVybiB7djoxLGg6e2E6aC5h
ZGRyLGM6aC5jaXR5LHM6aC5zdCx6OmguemlwLHE6aC5zcWZ0LHFyOmguc3FmdFIsdDpoLnB0eXBlLHU6bixiYzpoLmJlZHNDLGJyOmguYmVkc1IsaGM6aC5iYXRoc0MsaHI6aC5iYXRoc1IsbTpoLm1vbnRocyxkOihoLmRlc2N8fCIiKS5zbGljZSgwLDE1MDApfSxp
Oml0ZW1zLGNtOnN0YXRlLmNvbnRNYW51YWw/MTowfTsKfQpmdW5jdGlvbiBjb3B5TGluayhidG4pewogIGxvYWRTY3JpcHQoTFpfVVJMKS50aGVuKGZ1bmN0aW9uKCl7CiAgICB2YXIgZW5jPUxaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KEpT
T04uc3RyaW5naWZ5KHBheWxvYWQoKSkpOwogICAgdmFyIHVybD1sb2NhdGlvbi5vcmlnaW4rbG9jYXRpb24ucGF0aG5hbWUrIiNiPSIrZW5jOwogICAgaWYodXJsLmxlbmd0aD42MDAwKXsgYWxlcnQoIlRoaXMgYnVkZ2V0IGlzIHRvbyBsYXJnZSBmb3IgYSBzaGFy
ZSBsaW5rLiBVc2UgdGhlIGZpbGUgZG93bmxvYWRzIGluc3RlYWQgXHUyMDE0IHRoZXkgYXJlIG5ldmVyIGF0IHJpc2suIik7IHJldHVybjsgfQogICAgKG5hdmlnYXRvci5jbGlwYm9hcmQ/bmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodXJsKTpQcm9taXNl
LnJlamVjdCgpKS50aGVuKGZ1bmN0aW9uKCl7CiAgICAgIHZhciB0PWJ0bi50ZXh0Q29udGVudDsgYnRuLnRleHRDb250ZW50PSJMSU5LIENPUElFRCI7IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtidG4udGV4dENvbnRlbnQ9dDt9LDE4MDApOwogICAgfSkuY2F0Y2go
ZnVuY3Rpb24oKXsgd2luZG93LnByb21wdCgiQ29weSB0aGlzIGxpbms6Iix1cmwpOyB9KTsKICAgIHRyYWNrKCJyZWhhYl9saW5rX2NvcGllZCIpOwogIH0pLmNhdGNoKGZ1bmN0aW9uKCl7IGFsZXJ0KCJDb3VsZCBub3QgbG9hZCB0aGUgbGluayBsaWJyYXJ5LiBD
aGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4iKTsgfSk7Cn0KZnVuY3Rpb24gcmVzdG9yZUZyb21IYXNoKCl7CiAgdmFyIG09bG9jYXRpb24uaGFzaC5tYXRjaCgvI2I9KFtBLVphLXowLTkrXC0kX10rKS8pOyBpZighbSkgcmV0dXJuOwogIGxvYWRT
Y3JpcHQoTFpfVVJMKS50aGVuKGZ1bmN0aW9uKCl7CiAgICB0cnl7CiAgICAgIHZhciByYXc9TFpTdHJpbmcuZGVjb21wcmVzc0Zyb21FbmNvZGVkVVJJQ29tcG9uZW50KG1bMV0pOyBpZighcmF3KSByZXR1cm47CiAgICAgIHZhciBwPUpTT04ucGFyc2UocmF3KTsK
ICAgICAgaWYoIXB8fHAudiE9PTF8fHR5cGVvZiBwLmkhPT0ib2JqZWN0IikgcmV0dXJuOwogICAgICAvKiBzdHJpY3Qgc2NoZW1hOiBrbm93biBrZXlzIG9ubHksIG51bWJlcnMgY29lcmNlZCwgc3RyaW5ncyB0cnVuY2F0ZWQsIHJlbmRlcmVkIGFzIHRleHQgb25s
eSAqLwogICAgICB2YXIgaD1wLmh8fHt9OwogICAgICBzdGF0ZS5oZHIuYWRkcj1TdHJpbmcoaC5hfHwiIikuc2xpY2UoMCwxMjApOyBzdGF0ZS5oZHIuY2l0eT1TdHJpbmcoaC5jfHwiIikuc2xpY2UoMCw2MCk7CiAgICAgIHN0YXRlLmhkci5zdD1TVEFURVMuaW5k
ZXhPZihoLnMpPj0wP2guczoiIjsgc3RhdGUuaGRyLnppcD1TdHJpbmcoaC56fHwiIikuc2xpY2UoMCwxMCk7CiAgICAgIHN0YXRlLmhkci5zcWZ0PVN0cmluZyhoLnF8fCIiKS5zbGljZSgwLDcpOyBzdGF0ZS5oZHIuc3FmdFI9U3RyaW5nKGgucXJ8fCIiKS5zbGlj
ZSgwLDcpOyBzdGF0ZS5oZHIucHR5cGU9UFRZUEVTLmluZGV4T2YoaC50KT49MD9oLnQ6IlNGUiI7CiAgICAgIHZhciBodT1wYXJzZUludChoLnUsMTApOyBzdGF0ZS5oZHIudW5pdHM9KGh1Pj0yJiZodTw9NCk/aHU6MjsKICAgICAgc3RhdGUuaGRyLmJlZHNDPVN0
cmluZyhoLmJjfHwiIikuc2xpY2UoMCwzKTsgc3RhdGUuaGRyLmJlZHNSPVN0cmluZyhoLmJyfHwiIikuc2xpY2UoMCwzKTsKICAgICAgc3RhdGUuaGRyLmJhdGhzQz1TdHJpbmcoaC5oY3x8IiIpLnNsaWNlKDAsNCk7IHN0YXRlLmhkci5iYXRoc1I9U3RyaW5nKGgu
aHJ8fCIiKS5zbGljZSgwLDQpOwogICAgICBzdGF0ZS5oZHIubW9udGhzPVN0cmluZyhoLm18fCIiKS5zbGljZSgwLDQpOyBzdGF0ZS5oZHIuZGVzYz1TdHJpbmcoaC5kfHwiIikuc2xpY2UoMCwxNTAwKTsKICAgICAgZm9yKHZhciBrIGluIHAuaSl7CiAgICAgICAg
dmFyIGlkPXBhcnNlSW50KGssMTApOyBpZighYnlJZFtpZF0pIGNvbnRpbnVlOwogICAgICAgIHZhciBwYWlyPXAuaVtrXTsgaWYoIUFycmF5LmlzQXJyYXkocGFpcikpIGNvbnRpbnVlOwogICAgICAgIHZhciBhbXQ9cGFyc2VGbG9hdChwYWlyWzBdKTsgaWYoaXNG
aW5pdGUoYW10KSYmYW10PjApIHN0YXRlLmFtb3VudHNbaWRdPU1hdGgucm91bmQoYW10KjEwMCkvMTAwOwogICAgICAgIGlmKHBhaXJbMV0pIHN0YXRlLmRlc2NzW2lkXT1TdHJpbmcocGFpclsxXSkuc2xpY2UoMCwyMDApOwogICAgICAgIGlmKEFycmF5LmlzQXJy
YXkocGFpclsyXSkpIHN0YXRlLnVhbXRzW2lkXT1wYWlyWzJdLnNsaWNlKDAsNSkubWFwKGZ1bmN0aW9uKHgpeyB2YXIgdj1wYXJzZUZsb2F0KHgpOyByZXR1cm4gKGlzRmluaXRlKHYpJiZ2PjApP01hdGgucm91bmQodioxMDApLzEwMDowOyB9KTsKICAgICAgfQog
ICAgICBzdGF0ZS5jb250TWFudWFsPXAuY209PT0xOwogICAgICBzeW5jVW5pdFRvdGFscygpOwogICAgICBTRUNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHNlYyl7IC8vIG9wZW4gc2VjdGlvbnMgdGhhdCBhbHJlYWR5IGhvbGQgZGF0YQogICAgICAgIHZhciBoYXM9
c2VjLmdyb3Vwcy5zb21lKGZ1bmN0aW9uKGcpeyByZXR1cm4gZy5pdGVtcy5zb21lKGZ1bmN0aW9uKGlkKXsgcmV0dXJuIHN0YXRlLmFtb3VudHNbaWRdPjA7IH0pOyB9KTsKICAgICAgICBpZihoYXMpIHN0YXRlLnRvZ2dsZXNbc2VjLmtleV09dHJ1ZTsKICAgICAg
fSk7CiAgICAgIHJlbmRlcigpOwogICAgfWNhdGNoKGUpeyAvKiBtYWxmb3JtZWQgcGF5bG9hZCBcdTIwMTQgaWdub3JlIHNpbGVudGx5ICovIH0KICB9KTsKfQoKLyogLS0tLS0tLS0tLSBFWFBPUlRTIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gZXhwb3J0Um93cygp
ewogIHJldHVybiBJVEVNUy5tYXAoZnVuY3Rpb24oaXQpewogICAgcmV0dXJuIHtpZDppdC5pZCxuYW1lOml0Lm5hbWUsZGVzYzpzdGF0ZS5kZXNjc1tpdC5pZF18fCIiLGFtdDpzdGF0ZS5hbW91bnRzW2l0LmlkXXx8MH07CiAgfSk7Cn0KZnVuY3Rpb24gZmlsZUJh
c2UoKXsKICB2YXIgYT0oc3RhdGUuaGRyLmFkZHJ8fCJSZWhhYi1CdWRnZXQiKS5yZXBsYWNlKC9bXkEtWmEtejAtOSBdL2csIiIpLnRyaW0oKS5yZXBsYWNlKC8gKy9nLCJfIikuc2xpY2UoMCw0MCk7CiAgcmV0dXJuICJUZXJudXNfUmVoYWJfQnVkZ2V0XyIrKGF8
fCJTRlIiKTsKfQpmdW5jdGlvbiBkbEV4Y2VsKCl7CiAgbG9hZFNjcmlwdChYTFNYX1VSTCkudGhlbihmdW5jdGlvbigpewogICAgdmFyIG49dW5pdENvdW50KCk7CiAgICB2YXIgd3MgPSBuPjEgPyBtdWx0aVVuaXRTaGVldChuKSA6IHNmclNoZWV0KCk7CiAgICB2
YXIgd2I9WExTWC51dGlscy5ib29rX25ldygpOwogICAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3Yix3cywiUmVoYWIgQnVkZ2V0Iik7CiAgICBYTFNYLndyaXRlRmlsZSh3YixmaWxlQmFzZSgpKyIueGxzeCIpOwogICAgdHJhY2soInJlaGFiX2Rvd25s
b2FkIix7dHlwZToieGxzeCJ9KTsKICB9KS5jYXRjaChkbEZhaWwpOwp9CmZ1bmN0aW9uIHNmclNoZWV0KCl7CiAgdmFyIGg9c3RhdGUuaGRyOwogIC8qIEV4YWN0IHJlcGxpY2Egb2YgUmVoYWIgTGlzdCBUZW1wbGF0ZSBTRlIgXHUyMDE0IGxhYmVscywgbWVyZ2Vz
LCB3aWR0aHMsIGZvcm1hdHMsCiAgICAgYW5kIHRoZSBUb3RhbCBmb3JtdWxhIHZlcmlmaWVkIGFnYWluc3QgdGhlIGJsYW5rIHRlbXBsYXRlIChKdWx5IDYsIDIwMjYpLgogICAgIEhlYWRlciByb3dzIDEtNywgY29sdW1uIGhlYWRzIHJvdyA4LCBpdGVtcyByb3dz
IDktOTYsIFRvdGFsIENvc3Qgcm93IDk3LiAqLwogIHZhciBhb2E9WwogICAgWyIiLCJSZWhhYiBCdWRnZXQiLCIiLCIiLCIiLCIiXSwKICAgIFsiIiwiIiwiIiwiIiwiQ1VSUkVOVCIsIlJFSEFCQkVEIl0sCiAgICBbIiIsIkJvcnJvd2VyIE5hbWU6IixoLmJvcnJv
d2VyLCJTcSBGdCAoR0xBKToiLGguc3FmdCxoLnNxZnRSXSwKICAgIFsiIiwiUHJvcGVydHkgU3RyZWV0IEFkZHJlc3M6IixoLmFkZHIsIlByb3BlcnR5IFR5cGU6IixoLnB0eXBlLCIiXSwKICAgIFsiIiwiQ2l0eSwgU3RhdGUsIFppcDoiLChoLmNpdHk/aC5jaXR5
KyIsICI6IiIpK2guc3QrIiAiK2guemlwLCIjIG9mIEJlZHJvb21zOiIsaC5iZWRzQyxoLmJlZHNSXSwKICAgIFsiIiwiSG93IG1hbnkgbW9udGhzIHdpbGwgcHJvamVjdCB0YWtlPyIsaC5tb250aHMsIiMgb2YgQmF0aHJvb21zOiIsaC5iYXRoc0MsaC5iYXRoc1Jd
LAogICAgWyIiLCJEZXNjcmlwdGlvbiBvZiBXb3JrOiBcblBsZWFzZSBwcm92aWRlIGEgZGV0YWlsZWQgbmFycmF0aXZlIG9mIHRoZSByZXF1aXJlZCByZWhhYiB3b3JrLCBpbmNsdWRpbmcgYW55IGFkZGl0aW9ucywgY29udmVyc2lvbnMsIG9yIHJlZGVzaWducy4g
VGhlIG1vcmUgY29tcHJlaGVuc2l2ZSB5b3VyIGRlc2NyaXB0aW9ucyBpbiBib3RoIHRoZSBuYXJyYXRpdmUgYW5kIHRoZSBsaW5lIGl0ZW1zLCB0aGUgbW9yZSBhY2N1cmF0ZSB0aGUgQWZ0ZXIgUmVwYWlyIFZhbHVhdGlvbiB3aWxsIGJlLiIsaC5kZXNjLCIiLCIi
LCIiXSwKICAgIFsiSUQiLCJEcmF3IEl0ZW0gXG5QbGVhc2UgZG8gbm90IGNoYW5nZSB0aGUgbmFtZXMiLCJEcmF3IERlc2NyaXB0aW9uIFxuUHJvdmlkZSBhIGRldGFpbGVkIHNjb3BlIG9mIHdvcmsgZm9yIGV2ZXJ5IGxpbmUgaXRlbSB0aGF0IGluY2x1ZGVzIGEg
ZG9sbGFyIGFtb3VudC4iLCIiLCJVTklUIDFcbkRyYXcgQnVkZ2V0IiwiIl0KICBdOwogIElURU1TLmZvckVhY2goZnVuY3Rpb24oaXQpewogICAgdmFyIGE9c3RhdGUuYW1vdW50c1tpdC5pZF18fDA7CiAgICBhb2EucHVzaChbaXQuaWQsaXQubmFtZSxzdGF0ZS5k
ZXNjc1tpdC5pZF18fG51bGwsbnVsbCxhPjA/YTpudWxsLG51bGxdKTsKICB9KTsKICBhb2EucHVzaChbbnVsbCxudWxsLCJUb3RhbCBDb3N0OiIsbnVsbCxudWxsLG51bGxdKTsKICBhb2EucHVzaChbIiIsIiIsIiIsIiIsIiIsIiJdKTsKICBhb2EucHVzaChbRElT
Q0xBSU1FUiwiIiwiIiwiIiwiIiwiIl0pOwogIGFvYS5wdXNoKFsiRXhwb3J0ZWQgZnJvbSB0ZXJudXMuY29tL3Rvb2xzL3JlaGFiLWJ1ZGdldCBcdTIwMjIgIitURU1QTEFURV9WRVJTSU9OKyIgXHUyMDIyICIrbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNl
KDAsMTApLCIiLCIiLCIiLCIiLCIiXSk7CiAgdmFyIHdzPVhMU1gudXRpbHMuYW9hX3RvX3NoZWV0KGFvYSk7CiAgd3NbIkU5NyJdPXt0OiJuIixmOiJTVU0oRTk6Rjk2KSIsejonIiQiIywjIzAuMDAnfTsKICBmb3IodmFyIHI9OTtyPD05NjtyKyspeyB2YXIgYz13
c1siRSIrcl07IGlmKGMmJmMudD09PSJuIikgYy56PSciJCIjLCMjMC4wMCc7IH0KICB3c1siIWNvbHMiXT1be3djaDo1fSx7d2NoOjQ3Ljl9LHt3Y2g6NTUuNn0se3djaDoxNi42fSx7d2NoOjExLjZ9LHt3Y2g6OX1dOwogIHdzWyIhcm93cyJdPVt7aHB0OjIxfSxu
dWxsLG51bGwsbnVsbCxudWxsLG51bGwse2hwdDo5NC41fSx7aHB0OjQwLjV9XTsKICB2YXIgbWVyZ2VzPVt7czp7cjo2LGM6Mn0sZTp7cjo2LGM6NX19XTsKICBmb3IodmFyIHJyPTg7cnI8PTk3O3JyKyspewogICAgbWVyZ2VzLnB1c2goe3M6e3I6cnItMSxjOjJ9
LGU6e3I6cnItMSxjOjN9fSk7CiAgICBtZXJnZXMucHVzaCh7czp7cjpyci0xLGM6NH0sZTp7cjpyci0xLGM6NX19KTsKICB9CiAgd3NbIiFtZXJnZXMiXT1tZXJnZXM7CiAgcmV0dXJuIHdzOwp9CmZ1bmN0aW9uIG11bHRpVW5pdFNoZWV0KG4pewogIHZhciBoPXN0
YXRlLmhkcjsKICAvKiBSZXBsaWNhdGVzICJSZWhhYiBMaXN0IFRlbXBsYXRlIDEtNCBVbml0IiAoMi00IHVuaXRzKSBhbmQgIlJlaGFiIExpc3QgVGVtcGxhdGUKICAgICA1IFVuaXQiIFx1MjAxNCB1bml0IGNvbHVtbnMgRC4uIHBsdXMgcGVyLXJvdyBUT1RBTCBm
b3JtdWxhcywgY29sdW1uIHRvdGFscyByb3cgOTcsCiAgICAgVE9UQUwgQlVER0VUIHJvdyA5OSwgQzc6RjcgbWVyZ2UsIHdpZHRocy9oZWlnaHRzL2N1cnJlbmN5IGZvcm1hdHMgXHUyMDE0IHZlcmlmaWVkCiAgICAgYWdhaW5zdCB0aGUgYmxhbmsgdGVtcGxhdGVz
IHN1cHBsaWVkIEp1bHkgNywgMjAyNi4gKi8KICB2YXIgVT0obj09PTUpPzU6NDsgICAgICAgICAgICAgICAvLyB0aGUgdGVtcGxhdGUgYWx3YXlzIGNhcnJpZXMgNCBvciA1IHVuaXQgY29sdW1ucwogIHZhciBMPVhMU1gudXRpbHMuZW5jb2RlX2NvbDsKICB2YXIg
bGFzdFU9TCgyK1UpLCB0b3RMPUwoMytVKSwgQ1VSPSciJCIjLCMjMC4wMCc7CiAgdmFyIGFvYT1bCiAgICBbIiIsIlJlaGFiIEJ1ZGdldCJdLAogICAgWyIiLCIiLCIiLCIiLCJDVVJSRU5UIiwiUkVIQUJCRUQiXSwKICAgIFsiIiwiQm9ycm93ZXIgTmFtZToiLGgu
Ym9ycm93ZXIsIlNxIEZ0IChHTEEpOiIsaC5zcWZ0LGguc3FmdFJdLAogICAgWyIiLCJQcm9wZXJ0eSBTdHJlZXQgQWRkcmVzczoiLGguYWRkciwiUHJvcGVydHkgVHlwZToiLGgucHR5cGUrKGgucHR5cGU9PT0iMi00IFVuaXRzIj8iICgiK24rIiB1bml0cykiOiIi
KV0sCiAgICBbIiIsIkNpdHksIFN0YXRlLCBaaXA6IiwoaC5jaXR5P2guY2l0eSsiLCAiOiIiKStoLnN0KyIgIitoLnppcCwiIyBvZiBCZWRyb29tczoiLGguYmVkc0MsaC5iZWRzUl0sCiAgICBbIiIsIkhvdyBtYW55IG1vbnRocyB3aWxsIHByb2plY3QgdGFrZT8i
LGgubW9udGhzLCIjIG9mIEJhdGhyb29tczoiLGguYmF0aHNDLGguYmF0aHNSXSwKICAgIFsiIiwiRGVzY3JpcHRpb24gb2YgV29yazogXG5QbGVhc2UgcHJvdmlkZSBhIGRldGFpbGVkIG5hcnJhdGl2ZSBvZiB0aGUgcmVxdWlyZWQgcmVoYWIgd29yaywgaW5jbHVk
aW5nIGFueSBhZGRpdGlvbnMsIGNvbnZlcnNpb25zLCBvciByZWRlc2lnbnMuIFRoZSBtb3JlIGNvbXByZWhlbnNpdmUgeW91ciBkZXNjcmlwdGlvbnMgaW4gYm90aCB0aGUgbmFycmF0aXZlIGFuZCB0aGUgbGluZSBpdGVtcywgdGhlIG1vcmUgYWNjdXJhdGUgdGhl
IEFmdGVyIFJlcGFpciBWYWx1YXRpb24gd2lsbCBiZS4iLGguZGVzY10KICBdOwogIHZhciBoZHI4PVsiSUQiLCJEcmF3IEl0ZW0gXG5QbGVhc2UgZG8gbm90IGNoYW5nZSB0aGUgbmFtZXMiLCJEcmF3IERlc2NyaXB0aW9uIFxuUHJvdmlkZSBhIGRldGFpbGVkIHNj
b3BlIG9mIHdvcmsgZm9yIGV2ZXJ5IGxpbmUgaXRlbSB0aGF0IGluY2x1ZGVzIGEgZG9sbGFyIGFtb3VudC4iXTsKICBmb3IodmFyIHU9MTt1PD1VO3UrKykgaGRyOC5wdXNoKCJVTklUICIrdSsiXG5EcmF3IEJ1ZGdldCIpOwogIGhkcjgucHVzaCgiVE9UQUwiKTsK
ICBhb2EucHVzaChoZHI4KTsKICBJVEVNUy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgIHZhciByPVtpdC5pZCxpdC5uYW1lLHN0YXRlLmRlc2NzW2l0LmlkXXx8bnVsbF07CiAgICB2YXIgdWE9c3RhdGUudWFtdHNbaXQuaWRdfHxbXTsKICAgIGZvcih2YXIgaz0w
O2s8VTtrKyspeyB2YXIgdj0oazxuKT8odWFba118fDApOjA7IHIucHVzaCh2PjA/djpudWxsKTsgfQogICAgci5wdXNoKG51bGwpOwogICAgYW9hLnB1c2gocik7CiAgfSk7CiAgdmFyIHRvdFJvdz1bIiIsIiIsIlRvdGFsIENvc3Q6Il07IGZvcih1PTA7dTw9VTt1
KyspIHRvdFJvdy5wdXNoKG51bGwpOwogIGFvYS5wdXNoKHRvdFJvdyk7CiAgYW9hLnB1c2goW10pOwogIHZhciBidWRSb3c9W107IGZvcih2YXIgaT0wO2k8MitVO2krKykgYnVkUm93LnB1c2gobnVsbCk7CiAgYnVkUm93LnB1c2goIlRPVEFMIEJVREdFVDogIik7
IGJ1ZFJvdy5wdXNoKG51bGwpOwogIGFvYS5wdXNoKGJ1ZFJvdyk7CiAgYW9hLnB1c2goW10pOwogIGFvYS5wdXNoKFtESVNDTEFJTUVSXSk7CiAgYW9hLnB1c2goWyJFeHBvcnRlZCBmcm9tIHRlcm51cy5jb20vdG9vbHMvcmVoYWItYnVkZ2V0IFx1MjAyMiAiK1RF
TVBMQVRFX1ZFUlNJT04rIiBcdTIwMjIgIituZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCldKTsKICB2YXIgd3M9WExTWC51dGlscy5hb2FfdG9fc2hlZXQoYW9hKTsKICBmb3IodmFyIHI9OTtyPD05NjtyKyspewogICAgd3NbdG90TCtyXT17dDoi
biIsZjoiU1VNKEQiK3IrIjoiK2xhc3RVK3IrIikiLHo6Q1VSfTsKICAgIGZvcih1PTA7dTxVO3UrKyl7IHZhciBjPXdzW0woMyt1KStyXTsgaWYoYyYmYy50PT09Im4iKSBjLno9Q1VSOyB9CiAgfQogIGZvcih1PTA7dTxVO3UrKyl7IHZhciBjb2w9TCgzK3UpOyB3
c1tjb2wrIjk3Il09e3Q6Im4iLGY6IlNVTSgiK2NvbCsiOToiK2NvbCsiOTYpIix6OkNVUn07IH0KICB3c1t0b3RMKyI5NyJdPXt0OiJuIixmOiJTVU0oRDk3OiIrbGFzdFUrIjk3KSIsejpDVVJ9OwogIHdzW3RvdEwrIjk5Il09e3Q6Im4iLGY6IlNVTShEOTc6Iits
YXN0VSsiOTcpIix6OkNVUn07CiAgaWYod3NbTCgyK1UpKyI5OSJdKSB3c1tMKDIrVSkrIjk5Il0uej1DVVI7CiAgd3NbIiFjb2xzIl09KFU9PT00KQogICAgP1t7d2NoOjV9LHt3Y2g6NDcuOX0se3djaDo2OS4yfSx7d2NoOjE2LjZ9LHt3Y2g6MTQuMn0sbnVsbCxu
dWxsLHt3Y2g6MTUuNn0se3djaDo5fV0KICAgIDpbe3djaDo1fSx7d2NoOjQ3Ljl9LHt3Y2g6NjkuMn0se3djaDoxNi42fSx7d2NoOjE0LjJ9LG51bGwsbnVsbCx7d2NoOjE0LjJ9LHt3Y2g6MTUuNn0se3djaDo5fV07CiAgdmFyIHJvd3M9W3tocHQ6MjF9LG51bGws
bnVsbCxudWxsLG51bGwsbnVsbCx7aHB0Ojk0LjV9LHtocHQ6NDAuNX1dOwogIGZvcihyPTg7cjw5ODtyKyspIHJvd3MucHVzaChudWxsKTsKICByb3dzLnB1c2goe2hwdDozMS41fSk7CiAgd3NbIiFyb3dzIl09cm93czsKICB3c1siIW1lcmdlcyJdPVt7czp7cjo2
LGM6Mn0sZTp7cjo2LGM6NX19XTsKICByZXR1cm4gd3M7Cn0KZnVuY3Rpb24gZGxDc3YoKXsKICB2YXIgaD1zdGF0ZS5oZHIsIGxpbmVzPVtdLCBuPXVuaXRDb3VudCgpOwogIGZ1bmN0aW9uIHEodil7IHY9KHY9PW51bGw/IiI6U3RyaW5nKHYpKTsgcmV0dXJuICci
Jyt2LnJlcGxhY2UoLyIvZywnIiInKSsnIic7IH0KICBsaW5lcy5wdXNoKFsiVGVybnVzIFJlaGFiIEJ1ZGdldCIsIiIsIiIsIiJdLm1hcChxKS5qb2luKCIsIikpOwogIGxpbmVzLnB1c2goWyJQcm9wZXJ0eSIsaC5hZGRyKyIsICIraC5jaXR5KyIsICIraC5zdCsi
ICIraC56aXAsIlNxIEZ0IixoLnNxZnQrKGguc3FmdFI/IiAtPiAiK2guc3FmdFIrIiByZWhhYmJlZCI6IiIpXS5tYXAocSkuam9pbigiLCIpKTsKICBpZihuPjEpIGxpbmVzLnB1c2goWyJQcm9wZXJ0eSB0eXBlIixoLnB0eXBlLCJVbml0cyIsbl0ubWFwKHEpLmpv
aW4oIiwiKSk7CiAgdmFyIGhlYWQ9WyJJRCIsIkRyYXcgSXRlbSIsIkRyYXcgRGVzY3JpcHRpb24iXTsKICBpZihuPjEpeyBmb3IodmFyIHU9MTt1PD1uO3UrKykgaGVhZC5wdXNoKCJVbml0ICIrdSk7IH0KICBoZWFkLnB1c2goIkFtb3VudCIpOwogIGxpbmVzLnB1
c2goaGVhZC5tYXAocSkuam9pbigiLCIpKTsKICBleHBvcnRSb3dzKCkuZm9yRWFjaChmdW5jdGlvbihyKXsKICAgIHZhciByb3c9W3IuaWQsci5uYW1lLHIuZGVzY107CiAgICBpZihuPjEpeyB2YXIgdWE9c3RhdGUudWFtdHNbci5pZF18fFtdOyBmb3IodmFyIGs9
MDtrPG47aysrKSByb3cucHVzaCh1YVtrXXx8IiIpOyB9CiAgICByb3cucHVzaChyLmFtdD4wP3IuYW10OiIiKTsKICAgIGxpbmVzLnB1c2gocm93Lm1hcChxKS5qb2luKCIsIikpOwogIH0pOwogIHZhciB0b3RSb3c9WyIiLCIiLCJUb3RhbCBDb3N0Il07CiAgaWYo
bj4xKXsgZm9yKHZhciB0PTA7dDxuO3QrKykgdG90Um93LnB1c2goTWF0aC5yb3VuZCgodW5pdFN1YnRvdGFsKHQpKygoc3RhdGUudWFtdHNbODhdfHxbXSlbdF18fDApKSoxMDApLzEwMCk7IH0KICB0b3RSb3cucHVzaChncmFuZFRvdGFsKCkpOwogIGxpbmVzLnB1
c2godG90Um93Lm1hcChxKS5qb2luKCIsIikpOwogIGxpbmVzLnB1c2goW0RJU0NMQUlNRVIsIiIsIiIsIiJdLm1hcChxKS5qb2luKCIsIikpOwogIHZhciBibG9iPW5ldyBCbG9iKFsiXHVmZWZmIitsaW5lcy5qb2luKCJcclxuIildLHt0eXBlOiJ0ZXh0L2Nzdjtj
aGFyc2V0PXV0Zi04In0pOwogIHZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsgYS5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7IGEuZG93bmxvYWQ9ZmlsZUJhc2UoKSsiLmNzdiI7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsg
YS5jbGljaygpOyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO2EucmVtb3ZlKCk7fSw0MDApOwogIHRyYWNrKCJyZWhhYl9kb3dubG9hZCIse3R5cGU6ImNzdiJ9KTsKfQpmdW5jdGlvbiBkbFBkZigpewogIGxvYWRTY3Jp
cHQoSlNQREZfVVJMKS50aGVuKGZ1bmN0aW9uKCl7IHJldHVybiBsb2FkU2NyaXB0KEFVVE9UQUJMRV9VUkwpOyB9KS50aGVuKGZ1bmN0aW9uKCl7CiAgICB2YXIgZG9jPW5ldyBqc3BkZi5qc1BERigpLCBoPXN0YXRlLmhkcjsKICAgIGRvYy5zZXRUZXh0Q29sb3Io
MzgsNTgsMTI1KTsgZG9jLnNldEZvbnRTaXplKDE4KTsgZG9jLnRleHQoIlJlaGFiIEJ1ZGdldCIsMTQsMTYpOwogICAgZG9jLnNldEZvbnRTaXplKDEwKTsgZG9jLnNldFRleHRDb2xvcig2MCw3MCw4MCk7CiAgICBkb2MudGV4dCgoaC5hZGRyP2guYWRkcisiLCAi
OiIiKStoLmNpdHkrIiwgIitoLnN0KyIgIitoLnppcCsiICAgLSAgICIraC5zcWZ0KyhoLnNxZnRSPyIgLT4gIitoLnNxZnRSOiIiKSsiIHNxIGZ0ICAgLSAgICIraC5wdHlwZSwxNCwyMyk7CiAgICB2YXIgc3RhcnRZPTI4OwogICAgaWYoaC5kZXNjKXsgZG9jLnRl
eHQoZG9jLnNwbGl0VGV4dFRvU2l6ZSgiU2NvcGU6ICIraC5kZXNjLDE4MCksMTQsMjkpOyBzdGFydFk9MzY7IH0KICAgIHZhciBuPXVuaXRDb3VudCgpOwogICAgaWYobj4xKXsKICAgICAgdmFyIG1oPVsiSUQiLCJEcmF3IEl0ZW0iLCJEZXNjcmlwdGlvbiJdOwog
ICAgICBmb3IodmFyIHU9MTt1PD1uO3UrKykgbWgucHVzaCgiVW5pdCAiK3UpOwogICAgICBtaC5wdXNoKCJUb3RhbCIpOwogICAgICB2YXIgbWJvZHk9ZXhwb3J0Um93cygpLmZpbHRlcihmdW5jdGlvbihyKXtyZXR1cm4gci5hbXQ+MHx8ci5kZXNjO30pLm1hcChm
dW5jdGlvbihyKXsKICAgICAgICB2YXIgcm93PVtyLmlkLHIubmFtZSxyLmRlc2NdLCB1YT1zdGF0ZS51YW10c1tyLmlkXXx8W107CiAgICAgICAgZm9yKHZhciBrPTA7azxuO2srKykgcm93LnB1c2godWFba10/bW9uZXkodWFba10pOiIiKTsKICAgICAgICByb3cu
cHVzaChyLmFtdD4wP21vbmV5KHIuYW10KToiIik7CiAgICAgICAgcmV0dXJuIHJvdzsKICAgICAgfSk7CiAgICAgIHZhciBtdD1bIiIsIiIsIlRvdGFsIENvc3QiXTsKICAgICAgZm9yKHZhciB0PTA7dDxuO3QrKykgbXQucHVzaChtb25leSh1bml0U3VidG90YWwo
dCkrKChzdGF0ZS51YW10c1s4OF18fFtdKVt0XXx8MCkpKTsKICAgICAgbXQucHVzaChtb25leShncmFuZFRvdGFsKCkpKTsKICAgICAgbWJvZHkucHVzaChtdCk7CiAgICAgIHZhciBjcz17MDp7Y2VsbFdpZHRoOjh9fTsKICAgICAgZm9yKHZhciBjYz0wO2NjPG47
Y2MrKykgY3NbMytjY109e2hhbGlnbjoicmlnaHQiLGNlbGxXaWR0aDoxNn07CiAgICAgIGNzWzMrbl09e2hhbGlnbjoicmlnaHQiLGNlbGxXaWR0aDoxOX07CiAgICAgIGRvYy5hdXRvVGFibGUoe3N0YXJ0WTpzdGFydFksaGVhZDpbbWhdLGJvZHk6bWJvZHksCiAg
ICAgICAgc3R5bGVzOntmb250U2l6ZTo3LGNlbGxQYWRkaW5nOjEuMn0saGVhZFN0eWxlczp7ZmlsbENvbG9yOls4LDEyMCwxODNdfSxjb2x1bW5TdHlsZXM6Y3N9KTsKICAgIH1lbHNlewogICAgICB2YXIgYm9keT1leHBvcnRSb3dzKCkuZmlsdGVyKGZ1bmN0aW9u
KHIpe3JldHVybiByLmFtdD4wfHxyLmRlc2M7fSkubWFwKGZ1bmN0aW9uKHIpewogICAgICAgIHJldHVybiBbci5pZCxyLm5hbWUsci5kZXNjLHIuYW10PjA/bW9uZXkoci5hbXQpOiIiXTsKICAgICAgfSk7CiAgICAgIGJvZHkucHVzaChbIiIsIiIsIlRvdGFsIENv
c3QiLG1vbmV5KGdyYW5kVG90YWwoKSldKTsKICAgICAgZG9jLmF1dG9UYWJsZSh7c3RhcnRZOnN0YXJ0WSxoZWFkOltbIklEIiwiRHJhdyBJdGVtIiwiRGVzY3JpcHRpb24iLCJBbW91bnQiXV0sYm9keTpib2R5LAogICAgICAgIHN0eWxlczp7Zm9udFNpemU6OCxj
ZWxsUGFkZGluZzoxLjV9LGhlYWRTdHlsZXM6e2ZpbGxDb2xvcjpbOCwxMjAsMTgzXX0sY29sdW1uU3R5bGVzOnswOntjZWxsV2lkdGg6MTB9LDM6e2hhbGlnbjoicmlnaHQiLGNlbGxXaWR0aDoyNH19fSk7CiAgICB9CiAgICB2YXIgeT1kb2MubGFzdEF1dG9UYWJs
ZS5maW5hbFkrODsgaWYoeT4yNzApe2RvYy5hZGRQYWdlKCk7eT0xNjt9CiAgICBkb2Muc2V0Rm9udFNpemUoNyk7IGRvYy5zZXRUZXh0Q29sb3IoMTEwLDEyMCwxMzApOwogICAgZG9jLnRleHQoZG9jLnNwbGl0VGV4dFRvU2l6ZShESVNDTEFJTUVSKyIgRXhwb3J0
ZWQgZnJvbSB0ZXJudXMuY29tL3Rvb2xzL3JlaGFiLWJ1ZGdldCAtICIrbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApLDE4MiksMTQseSk7CiAgICBkb2Muc2F2ZShmaWxlQmFzZSgpKyIucGRmIik7CiAgICB0cmFjaygicmVoYWJfZG93bmxvYWQi
LHt0eXBlOiJwZGYifSk7CiAgfSkuY2F0Y2goZGxGYWlsKTsKfQpmdW5jdGlvbiBkbEZhaWwoKXsKICB2YXIgZT0kKCJkbEVyciIpOyBpZihlKXsgZS5zdHlsZS5kaXNwbGF5PSJibG9jayI7IGUudGV4dENvbnRlbnQ9IlRoYXQgZG93bmxvYWQgbGlicmFyeSBjb3Vs
ZCBub3QgbG9hZC4gQ2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCByZXRyeSwgb3IgdXNlIENTViAvIHlvdXIgZW1haWxlZCBsaW5rLiI7IH0KICB0cmFjaygicmVoYWJfZG93bmxvYWRfZmFpbGVkIik7Cn0KCi8qIC0tLS0tLS0tLS0gSU5JVCAtLS0tLS0tLS0tICov
CihmdW5jdGlvbigpewogIHRyeXsKICAgIHZhciBxPW5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKSwgcGFydHM9W107CiAgICBbInV0bV9zb3VyY2UiLCJ1dG1fbWVkaXVtIiwidXRtX2NhbXBhaWduIiwidXRtX3Rlcm0iLCJ1dG1fY29udGVudCIs
ImdjbGlkIl0uZm9yRWFjaChmdW5jdGlvbihrKXsKICAgICAgdmFyIHY9cS5nZXQoayk7IGlmKHYpeyBzdGF0ZS51dG1NYXBba109di5zbGljZSgwLDEwMCk7IHBhcnRzLnB1c2goay5yZXBsYWNlKCJ1dG1fIiwiIikrIj0iK3N0YXRlLnV0bU1hcFtrXSk7IH0KICAg
IH0pOwogICAgaWYoZG9jdW1lbnQucmVmZXJyZXIpeyBzdGF0ZS51dG1NYXAucmVmZXJyZXI9ZG9jdW1lbnQucmVmZXJyZXIuc2xpY2UoMCwyMDApOyBwYXJ0cy5wdXNoKCJyZWY9IitzdGF0ZS51dG1NYXAucmVmZXJyZXIpOyB9CiAgICBzdGF0ZS51dG09cGFydHMu
am9pbigiICIpOwogIH1jYXRjaChlKXt9CiAgdmFyIHBsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmJ0UHJpdmFjeUxpbmsiKTsgaWYocGwpIHBsLmhyZWY9Q09ORklHLlBSSVZBQ1lfVVJMOwp9KSgpOwpyZW5kZXIoKTsKcmVzdG9yZUZyb21IYXNoKCk7Cgpy
ZXR1cm4ge25leHQ6bmV4dCxwcmV2OnByZXYsc2V0VG9nZ2xlOnNldFRvZ2dsZSxvcGVuR2F0ZTpvcGVuR2F0ZSxjbG9zZUdhdGU6Y2xvc2VHYXRlLHN1Ym1pdEdhdGU6c3VibWl0R2F0ZSxmaW5pc2g6ZmluaXNoLAogICAgICAgIGNvcHlMaW5rOmNvcHlMaW5rLGRs
RXhjZWw6ZGxFeGNlbCxkbENzdjpkbENzdixkbFBkZjpkbFBkZn07Cn0pKCk7