IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQ0KIiIiIENvZGVjIGZvciB0aGUgUHVuaWNvZGUgZW5jb2RpbmcsIGFzIHNwZWNpZmllZCBpbiBSRkMgMzQ5Mg0KDQpXcml0dGVuIGJ5IE1hcnRpbiB2LiBM9ndpcy4NCiIiIg0KDQppbXBvcnQgY29kZWNzDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFbmNvZGluZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmRlZiBzZWdyZWdhdGUoc3RyKToNCiAgICAiIiIzLjEgQmFzaWMgY29kZSBwb2ludCBzZWdyZWdhdGlvbiIiIg0KICAgIGJhc2UgPSBbXQ0KICAgIGV4dGVuZGVkID0ge30NCiAgICBmb3IgYyBpbiBzdHI6DQogICAgICAgIGlmIG9yZChjKSA8IDEyODoNCiAgICAgICAgICAgIGJhc2UuYXBwZW5kKGMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBleHRlbmRlZFtjXSA9IDENCiAgICBleHRlbmRlZCA9IGV4dGVuZGVkLmtleXMoKQ0KICAgIGV4dGVuZGVkLnNvcnQoKQ0KICAgIHJldHVybiAiIi5qb2luKGJhc2UpLmVuY29kZSgiYXNjaWkiKSxleHRlbmRlZA0KDQpkZWYgc2VsZWN0aXZlX2xlbihzdHIsIG1heCk6DQogICAgIiIiUmV0dXJuIHRoZSBsZW5ndGggb2Ygc3RyLCBjb25zaWRlcmluZyBvbmx5IGNoYXJhY3RlcnMgYmVsb3cgbWF4LiIiIg0KICAgIHJlcyA9IDANCiAgICBmb3IgYyBpbiBzdHI6DQogICAgICAgIGlmIG9yZChjKSA8IG1heDoNCiAgICAgICAgICAgIHJlcyArPSAxDQogICAgcmV0dXJuIHJlcw0KDQpkZWYgc2VsZWN0aXZlX2ZpbmQoc3RyLCBjaGFyLCBpbmRleCwgcG9zKToNCiAgICAiIiJSZXR1cm4gYSBwYWlyIChpbmRleCwgcG9zKSwgaW5kaWNhdGluZyB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mDQogICAgY2hhciBpbiBzdHIuIGluZGV4IGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGNvbnNpZGVyaW5nDQogICAgb25seSBvcmRpbmFscyB1cCB0byBhbmQgaW5jbHVkaW5nIGNoYXIsIGFuZCBwb3MgaXMgdGhlIHBvc2l0aW9uIGluDQogICAgdGhlIGZ1bGwgc3RyaW5nLiBpbmRleC9wb3MgaXMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBmdWxsDQogICAgc3RyaW5nLiIiIg0KDQogICAgbCA9IGxlbihzdHIpDQogICAgd2hpbGUgMToNCiAgICAgICAgcG9zICs9IDENCiAgICAgICAgaWYgcG9zID09IGw6DQogICAgICAgICAgICByZXR1cm4gKC0xLCAtMSkNCiAgICAgICAgYyA9IHN0cltwb3NdDQogICAgICAgIGlmIGMgPT0gY2hhcjoNCiAgICAgICAgICAgIHJldHVybiBpbmRleCsxLCBwb3MNCiAgICAgICAgZWxpZiBjIDwgY2hhcjoNCiAgICAgICAgICAgIGluZGV4ICs9IDENCg0KZGVmIGluc2VydGlvbl91bnNvcnQoc3RyLCBleHRlbmRlZCk6DQogICAgIiIiMy4yIEluc2VydGlvbiB1bnNvcnQgY29kaW5nIiIiDQogICAgb2xkY2hhciA9IDB4ODANCiAgICByZXN1bHQgPSBbXQ0KICAgIG9sZGluZGV4ID0gLTENCiAgICBmb3IgYyBpbiBleHRlbmRlZDoNCiAgICAgICAgaW5kZXggPSBwb3MgPSAtMQ0KICAgICAgICBjaGFyID0gb3JkKGMpDQogICAgICAgIGN1cmxlbiA9IHNlbGVjdGl2ZV9sZW4oc3RyLCBjaGFyKQ0KICAgICAgICBkZWx0YSA9IChjdXJsZW4rMSkgKiAoY2hhciAtIG9sZGNoYXIpDQogICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICBpbmRleCxwb3MgPSBzZWxlY3RpdmVfZmluZChzdHIsYyxpbmRleCxwb3MpDQogICAgICAgICAgICBpZiBpbmRleCA9PSAtMToNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZGVsdGEgKz0gaW5kZXggLSBvbGRpbmRleA0KICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkZWx0YS0xKQ0KICAgICAgICAgICAgb2xkaW5kZXggPSBpbmRleA0KICAgICAgICAgICAgZGVsdGEgPSAwDQogICAgICAgIG9sZGNoYXIgPSBjaGFyDQoNCiAgICByZXR1cm4gcmVzdWx0DQoNCmRlZiBUKGosIGJpYXMpOg0KICAgICMgUHVueWNvZGUgcGFyYW1ldGVyczogdG1pbiA9IDEsIHRtYXggPSAyNiwgYmFzZSA9IDM2DQogICAgcmVzID0gMzYgKiAoaiArIDEpIC0gYmlhcw0KICAgIGlmIHJlcyA8IDE6IHJldHVybiAxDQogICAgaWYgcmVzID4gMjY6IHJldHVybiAyNg0KICAgIHJldHVybiByZXMNCg0KZGlnaXRzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSINCmRlZiBnZW5lcmF0ZV9nZW5lcmFsaXplZF9pbnRlZ2VyKE4sIGJpYXMpOg0KICAgICIiIjMuMyBHZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMiIiINCiAgICByZXN1bHQgPSBbXQ0KICAgIGogPSAwDQogICAgd2hpbGUgMToNCiAgICAgICAgdCA9IFQoaiwgYmlhcykNCiAgICAgICAgaWYgTiA8IHQ6DQogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRpZ2l0c1tOXSkNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQNCiAgICAgICAgcmVzdWx0LmFwcGVuZChkaWdpdHNbdCArICgoTiAtIHQpICUgKDM2IC0gdCkpXSkNCiAgICAgICAgTiA9IChOIC0gdCkgLy8gKDM2IC0gdCkNCiAgICAgICAgaiArPSAxDQoNCmRlZiBhZGFwdChkZWx0YSwgZmlyc3QsIG51bWNoYXJzKToNCiAgICBpZiBmaXJzdDoNCiAgICAgICAgZGVsdGEgLy89IDcwMA0KICAgIGVsc2U6DQogICAgICAgIGRlbHRhIC8vPSAyDQogICAgZGVsdGEgKz0gZGVsdGEgLy8gbnVtY2hhcnMNCiAgICAjICgoYmFzZSAtIHRtaW4pICogdG1heCkgLy8gMiA9PSA0NTUNCiAgICBkaXZpc2lvbnMgPSAwDQogICAgd2hpbGUgZGVsdGEgPiA0NTU6DQogICAgICAgIGRlbHRhID0gZGVsdGEgLy8gMzUgIyBiYXNlIC0gdG1pbg0KICAgICAgICBkaXZpc2lvbnMgKz0gMzYNCiAgICBiaWFzID0gZGl2aXNpb25zICsgKDM2ICogZGVsdGEgLy8gKGRlbHRhICsgMzgpKQ0KICAgIHJldHVybiBiaWFzDQoNCg0KZGVmIGdlbmVyYXRlX2ludGVnZXJzKGJhc2VsZW4sIGRlbHRhcyk6DQogICAgIiIiMy40IEJpYXMgYWRhcHRhdGlvbiIiIg0KICAgICMgUHVueWNvZGUgcGFyYW1ldGVyczogaW5pdGlhbCBiaWFzID0gNzIsIGRhbXAgPSA3MDAsIHNrZXcgPSAzOA0KICAgIHJlc3VsdCA9IFtdDQogICAgYmlhcyA9IDcyDQogICAgZm9yIHBvaW50cywgZGVsdGEgaW4gZW51bWVyYXRlKGRlbHRhcyk6DQogICAgICAgIHMgPSBnZW5lcmF0ZV9nZW5lcmFsaXplZF9pbnRlZ2VyKGRlbHRhLCBiaWFzKQ0KICAgICAgICByZXN1bHQuZXh0ZW5kKHMpDQogICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgcG9pbnRzPT0wLCBiYXNlbGVuK3BvaW50cysxKQ0KICAgIHJldHVybiAiIi5qb2luKHJlc3VsdCkNCg0KZGVmIHB1bnljb2RlX2VuY29kZSh0ZXh0KToNCiAgICBiYXNlLCBleHRlbmRlZCA9IHNlZ3JlZ2F0ZSh0ZXh0KQ0KICAgIGJhc2UgPSBiYXNlLmVuY29kZSgiYXNjaWkiKQ0KICAgIGRlbHRhcyA9IGluc2VydGlvbl91bnNvcnQodGV4dCwgZXh0ZW5kZWQpDQogICAgZXh0ZW5kZWQgPSBnZW5lcmF0ZV9pbnRlZ2VycyhsZW4oYmFzZSksIGRlbHRhcykNCiAgICBpZiBiYXNlOg0KICAgICAgICByZXR1cm4gYmFzZSArICItIiArIGV4dGVuZGVkDQogICAgcmV0dXJuIGV4dGVuZGVkDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEZWNvZGluZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmRlZiBkZWNvZGVfZ2VuZXJhbGl6ZWRfbnVtYmVyKGV4dGVuZGVkLCBleHRwb3MsIGJpYXMsIGVycm9ycyk6DQogICAgIiIiMy4zIEdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycyIiIg0KICAgIHJlc3VsdCA9IDANCiAgICB3ID0gMQ0KICAgIGogPSAwDQogICAgd2hpbGUgMToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgY2hhciA9IG9yZChleHRlbmRlZFtleHRwb3NdKQ0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgIGlmIGVycm9ycyA9PSAic3RyaWN0IjoNCiAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJpbmNvbXBsZXRlIHB1bmljb2RlIHN0cmluZyINCiAgICAgICAgICAgIHJldHVybiBleHRwb3MgKyAxLCBOb25lDQogICAgICAgIGV4dHBvcyArPSAxDQogICAgICAgIGlmIDB4NDEgPD0gY2hhciA8PSAweDVBOiAjIEEtWg0KICAgICAgICAgICAgZGlnaXQgPSBjaGFyIC0gMHg0MQ0KICAgICAgICBlbGlmIDB4MzAgPD0gY2hhciA8PSAweDM5Og0KICAgICAgICAgICAgZGlnaXQgPSBjaGFyIC0gMjIgIyAweDMwLTI2DQogICAgICAgIGVsaWYgZXJyb3JzID09ICJzdHJpY3QiOg0KICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJJbnZhbGlkIGV4dGVuZGVkIGNvZGUgcG9pbnQgJyVzJyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGV4dGVuZGVkW2V4dHBvc10pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gZXh0cG9zLCBOb25lDQogICAgICAgIHQgPSBUKGosIGJpYXMpDQogICAgICAgIHJlc3VsdCArPSBkaWdpdCAqIHcNCiAgICAgICAgaWYgZGlnaXQgPCB0Og0KICAgICAgICAgICAgcmV0dXJuIGV4dHBvcywgcmVzdWx0DQogICAgICAgIHcgPSB3ICogKDM2IC0gdCkNCiAgICAgICAgaiArPSAxDQoNCg0KZGVmIGluc2VydGlvbl9zb3J0KGJhc2UsIGV4dGVuZGVkLCBlcnJvcnMpOg0KICAgICIiIjMuMiBJbnNlcnRpb24gdW5zb3J0IGNvZGluZyIiIg0KICAgIGNoYXIgPSAweDgwDQogICAgcG9zID0gLTENCiAgICBiaWFzID0gNzINCiAgICBleHRwb3MgPSAwDQogICAgd2hpbGUgZXh0cG9zIDwgbGVuKGV4dGVuZGVkKToNCiAgICAgICAgbmV3cG9zLCBkZWx0YSA9IGRlY29kZV9nZW5lcmFsaXplZF9udW1iZXIoZXh0ZW5kZWQsIGV4dHBvcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlhcywgZXJyb3JzKQ0KICAgICAgICBpZiBkZWx0YSBpcyBOb25lOg0KICAgICAgICAgICAgIyBUaGVyZSB3YXMgYW4gZXJyb3IgaW4gZGVjb2RpbmcuIFdlIGNhbid0IGNvbnRpbnVlIGJlY2F1c2UNCiAgICAgICAgICAgICMgc3luY2hyb25pemF0aW9uIGlzIGxvc3QuDQogICAgICAgICAgICByZXR1cm4gYmFzZQ0KICAgICAgICBwb3MgKz0gZGVsdGErMQ0KICAgICAgICBjaGFyICs9IHBvcyAvLyAobGVuKGJhc2UpICsgMSkNCiAgICAgICAgaWYgY2hhciA+IDB4MTBGRkZGOg0KICAgICAgICAgICAgaWYgZXJyb3JzID09ICJzdHJpY3QiOg0KICAgICAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgKCJJbnZhbGlkIGNoYXJhY3RlciBVKyV4IiAlIGNoYXIpDQogICAgICAgICAgICBjaGFyID0gb3JkKCc/JykNCiAgICAgICAgcG9zID0gcG9zICUgKGxlbihiYXNlKSArIDEpDQogICAgICAgIGJhc2UgPSBiYXNlWzpwb3NdICsgdW5pY2hyKGNoYXIpICsgYmFzZVtwb3M6XQ0KICAgICAgICBiaWFzID0gYWRhcHQoZGVsdGEsIChleHRwb3MgPT0gMCksIGxlbihiYXNlKSkNCiAgICAgICAgZXh0cG9zID0gbmV3cG9zDQogICAgcmV0dXJuIGJhc2UNCg0KZGVmIHB1bnljb2RlX2RlY29kZSh0ZXh0LCBlcnJvcnMpOg0KICAgIHBvcyA9IHRleHQucmZpbmQoIi0iKQ0KICAgIGlmIHBvcyA9PSAtMToNCiAgICAgICAgYmFzZSA9ICIiDQogICAgICAgIGV4dGVuZGVkID0gdGV4dA0KICAgIGVsc2U6DQogICAgICAgIGJhc2UgPSB0ZXh0Wzpwb3NdDQogICAgICAgIGV4dGVuZGVkID0gdGV4dFtwb3MrMTpdDQogICAgYmFzZSA9IHVuaWNvZGUoYmFzZSwgImFzY2lpIiwgZXJyb3JzKQ0KICAgIGV4dGVuZGVkID0gZXh0ZW5kZWQudXBwZXIoKQ0KICAgIHJldHVybiBpbnNlcnRpb25fc29ydChiYXNlLCBleHRlbmRlZCwgZXJyb3JzKQ0KDQojIyMgQ29kZWMgQVBJcw0KDQpjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOg0KDQogICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6DQogICAgICAgIHJlcyA9IHB1bnljb2RlX2VuY29kZShpbnB1dCkNCiAgICAgICAgcmV0dXJuIHJlcywgbGVuKGlucHV0KQ0KDQogICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6DQogICAgICAgIGlmIGVycm9ycyBub3QgaW4gKCdzdHJpY3QnLCAncmVwbGFjZScsICdpZ25vcmUnKToNCiAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzDQogICAgICAgIHJlcyA9IHB1bnljb2RlX2RlY29kZShpbnB1dCwgZXJyb3JzKQ0KICAgICAgICByZXR1cm4gcmVzLCBsZW4oaW5wdXQpDQoNCmNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToNCiAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6DQogICAgICAgIHJldHVybiBwdW55Y29kZV9lbmNvZGUoaW5wdXQpDQoNCmNsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToNCiAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6DQogICAgICAgIGlmIHNlbGYuZXJyb3JzIG5vdCBpbiAoJ3N0cmljdCcsICdyZXBsYWNlJywgJ2lnbm9yZScpOg0KICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitzZWxmLmVycm9ycw0KICAgICAgICByZXR1cm4gcHVueWNvZGVfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycykNCg0KY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOg0KICAgIHBhc3MNCg0KY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOg0KICAgIHBhc3MNCg0KIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJDQoNCmRlZiBnZXRyZWdlbnRyeSgpOg0KICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKA0KICAgICAgICBuYW1lPSdwdW55Y29kZScsDQogICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwNCiAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLA0KICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLA0KICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLA0KICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLA0KICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLA0KICAgICkNCg==