Убрал мерцание текста в меню расширения Добавил заготовку для автоматического заполнения тестов(На стадии тестирования, работает только часть заданий)
34 lines
66 KiB
JavaScript
34 lines
66 KiB
JavaScript
chrome.storage.sync.get(['true_mode'], function(items) {
|
|
var choise=items['true_mode'];
|
|
if(choise == undefined) choise = false;
|
|
if(choise) on();
|
|
});
|
|
//Функция перехвата
|
|
var f = function(details) {
|
|
if (details.url.indexOf('app.js') !== -1) {
|
|
return {redirectUrl: "data:text/javascript;charset=UTF-8;base64,LyogSU5KRUNURUQgKi8NCnZhciBjdXBBcHAgPSBhbmd1bGFyLm1vZHVsZSgnQW5ndWxhckpTQXBwJywgWyduZ1JvdXRlJywgJ25nUmVzb3VyY2UnLCAnbmdTYW5pdGl6ZSddKTsNCmNvbnNvbGUubG9nKCJJTkpFQ1RFRCIpOw0KDQovKg0KICpUT0RPIG5nLWJpbmQtaHRtbC11bnNhZmUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCB3aXRoIHYxLjIuMyBoZW5jZQ0KIGZvciBub3cgdHJ1c3RpbmcgYWxsIGlucHV0IGRhdGEsIHdpbGwgY29tZSBiYWNrIHRvIHRoaXMgbGF0ZXIuICovDQpjdXBBcHAuY29uZmlnKFsnJHNjZVByb3ZpZGVyJywgZnVuY3Rpb24oJHNjZVByb3ZpZGVyKSB7DQogICAgICAgICAgJHNjZVByb3ZpZGVyLmVuYWJsZWQoZmFsc2UpOw0KICAgICB9XSk7DQoNCi8vYXMgYW5ndWxhckpTIDEuMi4yIGRvZXMgbm90IHN1cHBvcnQgbmctYmluZC1odG1sIGhlbmNlDQovL2ZvbGxsb3dpbmcgZGlyZWN0aXZlIGlzIHRvIGVtdWx0YXRlIGp1c3QgdGhhdC4gd2lsbCByZXZpc2l0IHRoaXMgdG8gc2VlIGlmIHdlIGNhbiBvcHRpbWl6ZSBpdCBhbnkgZnVydGhlci4gDQpjdXBBcHAuZGlyZWN0aXZlKCdkeW5hbWljJywgZnVuY3Rpb24oJGNvbXBpbGUpIHsNCiAgICAgcmV0dXJuIHsNCiAgICAgICAgICByZXN0cmljdDogJ0EnLA0KICAgICAgICAgIHJlcGxhY2U6IHRydWUsDQogICAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZSwgYXR0cnMpIHsNCiAgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChhdHRycy5keW5hbWljLCBmdW5jdGlvbihodG1sKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZS5odG1sKGh0bWwpOw0KICAgICAgICAgICAgICAgICAgICAkY29tcGlsZShlbGUuY29udGVudHMoKSkoc2NvcGUpOw0KICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgfQ0KICAgICB9Ow0KfSk7DQoNCg0KY3VwQXBwLmNvbnRyb2xsZXIoJ0hlYWRlckN0cmwnLCBmdW5jdGlvbigkc2NvcGUsICRzY2UsIGFwcFNlcnZpY2UsICRyb3V0ZSwgJGxvY2F0aW9uLCBTY29yZVNlcnZpY2UsJGludGVydmFsKSB7DQogICAgICAkc2NvcGUuaXNTaG93UG9wdXAgPSBmYWxzZTsNCiAgICAgJHNjb3BlLnBvcHVwQ29udGVudCA9ICIiOw0KICAgICAkc2NvcGUuZ1Nob3dGZWVkYmFja0JveCA9IGZhbHNlOw0KICAgICAkc2NvcGUuZ0NvcnJlY3RBbnN3ZXJDb3VudCA9IDA7DQogICAgICRzY29wZS5ndG90YWxBbnN3ZXJDb3VudCA9IDA7DQogICAgICRzY29wZS5nQWN0aXZpdHlJbmZvID0ge307DQogICAgICRzY29wZS5nRmVlZGJhY2tUaXRsZSA9ICIiOw0KICAgICAkc2NvcGUuZ0ZlZWRiYWNrVGV4dCA9ICIiOw0KICAgICAkc2NvcGUuZ0Rpc2FibGVDaGVjayA9IGZhbHNlOyAgIC8vLS0gQWRkZWQgb24gMjgvMDMvMjAxNCB0byBkaXNhYmxlIGNoZWNrIGJ0biBvbiBjbGljayAtLSAvLw0KICAgICAkc2NvcGUuZ0ZpbmlzaENsaWNrZWQgPSBmYWxzZTsNCiAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9IHRydWU7DQogICAgICRzY29wZS5nRGlzYWJsZVN0YXJ0QWdhaW4gPSBmYWxzZTsNCiAgICAgJHNjb3BlLmdTaG93U3RhcnRBZ2FpbkJveCA9IGZhbHNlOw0KICAgICAkc2NvcGUuZ0NvdXJzZUNvbXBsZXRlZCA9IGZhbHNlOw0KICAgICAkc2NvcGUuZ0NvcnJlY3RBbnN3ZXJEaXNwbGF5ZWQgPSBmYWxzZTsNCiAgICAgJHNjb3BlLmdTaG93SGludEJ1dHRvbiA9IGZhbHNlOw0KICAgICAkc2NvcGUuZ0RhdGFGb2xkZXIgPSAnZGF0YS8nOw0KICAgICAkc2NvcGUuc2hvd0FjdGl2aXRpZXNJbmRleGVzID0gdHJ1ZTsNCiAgICAgJHNjb3BlLmF1ZGlvUGF0aCA9ICIiOw0KICAgICAvLyAkc2NvcGUudmlkZW9QYXRoPSdhc3NldHMvY2hvaWNlL3ZpZGVvL0NFUF9GTFBSX1ZfQTJVN0VFXzAxLm1wNCcNCiAgICAgJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPSBmYWxzZTsNCiAgICAgJHNjb3BlLmFjdGl2YXRlQXVkaW9TY3JpcHQgPSBmYWxzZTsNCiAgICAgLy8kc2NvcGUudHJhY2tUZXh0ID0gJzxiPlRyYXNjcmlwdDwvYj4gdGV4dCB3aWxsIGNvbWUgaGVyZSc7DQogICAgICRzY29wZS50cmFja1RleHQgPSAnJzsNCiAgICAgJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPSAxOyAvLy0tIEFkZGVkIG9uIDEwLzA0LzIwMTQgIC0tIC8vDQogICAgICRzY29wZS5nVGVtcGxhdGVVcmxBcnJheSA9IFsiIl07IC8vLS0gQWRkZWQgb24gMTAvMDQvMjAxNCAgLS0gLy8NCiAgICAgJHNjb3BlLml0ZW1BdWRpb0FyciA9IFtdOw0KICAgICAkc2NvcGUudmlkZW9Qb3NpdGlvbiA9ICdyZWxhdGl2ZSc7DQogICAgICRzY29wZS52aWRlb0xlZnRQYXRoID0gJyc7DQogICAgICRzY29wZS52aWRlb1JpZ2h0UGF0aCA9ICcnOw0KICAgICAkc2NvcGUuYWN0aXZpdHlMV2lkdGggPSA2MDsNCiAgICAgJHNjb3BlLmFjdGl2aXR5UldpZHRoID0gNDA7DQogICAgICRzY29wZS50cmFja1RleHQgPSAiIjsNCiAgICAgJHNjb3BlLnZpZGVvUG9zaXRpb24gPSAnYWJzb2x1dGUnOw0KICAgICAkc2NvcGUuZ2JhY2tCdG5EaXNhYmxlZCA9IHRydWU7DQogICAgICRzY29wZS5nbmV4dEJ0bkRpc2FibGVkID0gdHJ1ZTsNCiAgICAgJHNjb3BlLnBhZ2VDb21wbGV0aW9uQXJyYXkgPSBbJyddOw0KICAgICAkc2NvcGUuZW5hYmxlTmV4dHBhZ2UgPSBbJyddOw0KCSAkc2NvcGUubG1zSW5pdENhbGxlZD1mYWxzZTsNCiAgICAgdmFyIHRlbXBfaWQ7DQogICAgIC8vbG9hZCBnbG9iYWwgY29uZmlnLi4NCgkgDQoJICAkc2NvcGUuJG9uKCdsbXNJbml0JywgZnVuY3Rpb24oZSx2YWwpew0KCQkJLy8kKCIjcHJvZ3Jlc3MiKS5hcHBlbmQoJ2xtcyBpbml0Ojo6JysgdmFsKTsNCgkJCSRzY29wZS5sbXNJbml0Q2FsbGVkPXRydWU7DQoJCX0pOw0KCSAgICAgIGFwcFNlcnZpY2UuZ2V0KCJkYXRhL2NvbmZpZy5qc29uIikudGhlbihmdW5jdGlvbihkYXRhKSB7DQogICAgICAgICAgJHNjb3BlLmFwcF9kYXRhID0gZGF0YTsNCiAgICAgICAgICBpZiAoZGF0YS5hY3Rpdml0aXRlcy5sZW5ndGggPiAxKSB7DQogICAgICAgICAgICAgICAkc2NvcGUuc2hvd0FjdGl2aXRpZXNJbmRleGVzID0gZmFsc2U7DQogICAgICAgICAgfQ0KICAgICAgICAgIFNjb3JlU2VydmljZS5zZXRBY3Rpdml0eUNvdW50KGRhdGEuYWN0aXZpdGl0ZXMubGVuZ3RoKTsNCiAgICAgICAgICAvLy0tIEFkZGVkIG9uIDEwLzA0LzIwMTQgIC0tIC8vDQogICAgICAgICAgZGF0YS5hY3Rpdml0aXRlcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7DQogICAgICAgICAgICAgICAkc2NvcGUuZ1RlbXBsYXRlVXJsQXJyYXlbaW5kZXhdID0gJyMnICsgaXRlbS50ZW1wbGF0ZUlEICsgJy8nICsgaXRlbS5kYXRhZmlsZTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCiAgICAgICAgICAkc2NvcGUuYXNzaWduUGFnZUNvbXBsZXRpb25BcnJheShkYXRhLmFjdGl2aXRpdGVzLmxlbmd0aCk7DQoNCiAgICAgICAgICAkKCc8ZGl2PicpLmF0dHIoJ2lkJywgJ2RlYnVnJykuY3NzKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpLmNzcygndG9wJywgJzEwMHB4JykuY3NzKCdsZWZ0JywgJzUwcHgnKS5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgcmVkJykuaGlkZSgpLmFwcGVuZFRvKCQoJ2JvZHknKSkNCiAgICAgICAgICB2YXIgYWN0aXZpdHkgPSBkYXRhLmFjdGl2aXRpdGVzWzBdOw0KICAgICAgICAgIHZhciByZWRpcmVjdFRvID0gJy8nICsgYWN0aXZpdHkudGVtcGxhdGVJRCArICcvJyArIGFjdGl2aXR5LmRhdGFmaWxlOw0KICAgICAgICAgICRsb2NhdGlvbi5wYXRoKHJlZGlyZWN0VG8pOw0KDQogICAgICAgICAgLy90ZW1wX2lkPWFjdGl2aXR5LnRlbXBsYXRlSUQ7DQogICAgIH0pOw0KCQ0KICAgICAkc2NvcGUuJG9uKCdvbkl0ZW1BdWRpb0xvYWQnLCBmdW5jdGlvbihlLCBvYmopIHsNCiAgICAgICAgICAkc2NvcGUuaXRlbUF1ZGlvQXJyLnB1c2gob2JqKTsNCiAgICAgfSk7DQogICAgICRzY29wZS4kb24oJ29uVGVtcGxhdGVEZXN0cm95ZWQnLCBmdW5jdGlvbihlLCBvYmopIHsNCiAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgd2hpbGUgKCRzY29wZS5pdGVtQXVkaW9BcnIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICRzY29wZS5pdGVtQXVkaW9BcnIucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkualBsYXllcigiZGVzdHJveSIpOw0KICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiY2FsbGluZy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIiskc2NvcGUuaXRlbUF1ZGlvQXJyLmxlbmd0aCkJDQogICAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgIH0NCiAgICAgfSk7DQoNCiAgICAgJHNjb3BlLiRvbignb25BY3Rpdml0eUluZm9Mb2FkZWQnLCBmdW5jdGlvbihlLCBvYmopIHsNCgkgCSAgJHNjb3BlLmhpZGVHbG9iYWxQbGF5ZXIgPSBmYWxzZQ0KICAgICAgICAgICRzY29wZS52VHJhY2tUZXh0ID0gIiI7DQogICAgICAgICAgJHNjb3BlLnZpZGVvTGVmdFBhdGggPSAnJzsNCiAgICAgICAgICAkc2NvcGUudmlkZW9SaWdodFBhdGggPSAnJzsNCiAgICAgICAgICAkc2NvcGUuYWN0aXZpdHlMV2lkdGggPSA2MDsNCiAgICAgICAgICAkc2NvcGUuYWN0aXZpdHlSV2lkdGggPSA0MDsNCiAgICAgICAgICAkc2NvcGUudHJhY2tUZXh0ID0gIiI7DQogICAgICAgICAgJHNjb3BlLmF1ZGlvUGF0aCA9ICIiDQogICAgICAgICAgJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPSBmYWxzZTsNCiAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1NjcmlwdCA9IGZhbHNlOw0KDQogICAgICAgICAgJHNjb3BlLmdBY3Rpdml0eUluZm8gPSBvYmo7DQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlQ2hlY2sgPSBmYWxzZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU3RhcnRBZ2FpbiA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nU2hvd0ZlZWRiYWNrQm94ID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLmdTaG93U3RhcnRBZ2FpbkJveCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIgPSB0cnVlOw0KICAgICAgICAgICRzY29wZS5nQ29ycmVjdEFuc3dlckRpc3BsYXllZCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nQ291cnNlQ29tcGxldGVkID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLmdGaW5pc2hDbGlja2VkID0gZmFsc2U7DQogICAgICAgICAgJCgnI3BvcHVwSGludCcpLmRpYWxvZygiY2xvc2UiKTsNCiAgICAgICAgICAkKCcjcG9wdXBIZWxwJykuZGlhbG9nKCJjbG9zZSIpOw0KICAgICAgICAgICQoJyNwb3B1cEFjdGl2aXR5Rm9jdXMnKS5kaWFsb2coImNsb3NlIik7DQogICAgICAgICAgLy8kKCIudHJhbnNjcmlwdFBvcHVwIikuZGlhbG9nKCJkZXN0cm95Iik7DQogICAgICAgICAgLy8kKCIudlBhbiIpLmRpYWxvZygiZGVzdHJveSIpOw0KICAgICAgICAgIC8vJCgiLmFQYW4iKS5kaWFsb2coImRlc3Ryb3kiKTsNCiAgICAgICAgICAkKCIuYVBhbiIpLmRpYWxvZygnY2xvc2UnKTsNCiAgICAgICAgICAkKCIudlBhbiIpLmRpYWxvZygnY2xvc2UnKTsNCiAgICAgICAgICAkKCcjcG9wdXBIZWxwJykucGFyZW50KCkuY3NzKCdtaW4td2lkdGgnLCAnMjY1cHgnKTsNCiAgICAgICAgICAkKCcjcG9wdXBIZWxwJykuY3NzKCdwYWRkaW5nLWxlZnQnLCAnMTVweCcpOw0KCQkgIHZhciBzdG9wOw0KICAgICAgICAgIC8vICRzY29wZS5hc3NpZ25RdWVzdGlvbkF1ZGlvVG9QbGF5ZXIoKTsNCiAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8uaXNBY3Rpdml0eVBhZ2UgPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5nRGlzYWJsZUNoZWNrID0gdHJ1ZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVTdGFydEFnYWluID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLmhpZGVHbG9iYWxQbGF5ZXIgPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAkc2NvcGUuaGlkZUdsb2JhbFBsYXllciA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmhpZGVHbG9iYWxQbGF5ZXINCiAgICAgICAgICB9DQoJCSAgDQoJCSAgc3RvcCA9ICRpbnRlcnZhbChmdW5jdGlvbigpIHsNCgkJICAvLyAkKCIjcHJvZ3Jlc3MiKS5hcHBlbmQoJ1xud2FpdCBmb3IgbG1zIGluaXQ6OjonKTsNCgkJIAlpZigkc2NvcGUubG1zSW5pdENhbGxlZCl7DQoJCQkJU2NvcmVTZXJ2aWNlLmFkZFZpc2l0ZWQoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgLSAxKQ0KCQkJCXZhciBwcm9ncmVzcyA9IFNjb3JlU2VydmljZS5nZXRQcm9ncmVzcygpOw0KCQkJCSRzY29wZS4kYnJvYWRjYXN0KCdzZW5kUHJvZ3Jlc3MnLCBwcm9ncmVzcyk7DQoJCQkJJGludGVydmFsLmNhbmNlbChzdG9wKTsNCgkJCQlzdG9wID0gdW5kZWZpbmVkOw0KCQkJIH19LCAxMDApDQoJCSAgDQoJCSAgDQoJCSAgDQogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24oc2NvcGUpIHsNCg0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1NjcmlwdCA9IGZhbHNlOw0KDQogICAgICAgICAgICAgICAgICAgIC8vICRzY29wZS5tZXNzYWdlID0gIlRpbWVvdXQgY2FsbGVkISI7DQogICAgICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gdW5kZWZpbmVkICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoICE9PSAidW5kZWZpbmVkIiAmJiAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSB1bmRlZmluZWQgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSAiIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmF1ZGlvUGF0aCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzBdLmF1ZGlvUGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS50cmFja1RleHQgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aFswXS50cmFja1R4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9ICEoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0ucXVlc3Rpb25BdWRpb0FmdGVyQ2hlY2spOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFjdGl2YXRlQXVkaW9TY3JpcHQgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aFswXS5hY3RpdmVBdWRpb1NjcmlwdEFmdGVyQ2hlY2s7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGJyb2FkY2FzdCgndG9nZ2xlQXVkaW9TY3JpcHQnLCAkc2NvcGUuYWN0aXZhdGVBdWRpb1NjcmlwdCk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzBdLnF1ZXN0aW9uQXVkaW9BZnRlckNoZWNrID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaXNBdWRpb0F2YWlsYWJsZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3R5bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPT09IGZhbHNlICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzBdLnF1ZXN0aW9uQXVkaW9BZnRlckNoZWNrICE9PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUgPSB7J3Zpc2liaWxpdHknOiAnaGlkZGVuJ307DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPT09IGZhbHNlICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzBdLnF1ZXN0aW9uQXVkaW9BZnRlckNoZWNrID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUgPSB7J3Zpc2liaWxpdHknOiAndmlzaWJsZSd9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUgPSB7J3Zpc2liaWxpdHknOiAndmlzaWJsZSd9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnZpZGVvUG9zaXRpb24gPT09ICdyZWxhdGl2ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmlkZW9Qb3NpdGlvbiA9ICdyZWxhdGl2ZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgLy8kc2NvcGUudmlkZW9QYXRoPSIiOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS52aWRlb1Bvc2l0aW9uID0gJ2Fic29sdXRlJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8udmlkZW9QYXRoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnZpZGVvUGF0aFswXS5wYXRoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnZpZGVvUG9zaXRpb24gPT0gJ2Fic29sdXRlJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmlkZW9MZWZ0UGF0aCA9ICIiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmlkZW9SaWdodFBhdGggPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby52aWRlb1BhdGhbMF0ucGF0aA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnZpZGVvUmlnaHRQYXRoID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS52aWRlb0xlZnRQYXRoID0gJHNjb3BlLmdBY3Rpdml0eUluZm8udmlkZW9QYXRoWzBdLnBhdGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIkxMTExMIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3Rpdml0eUxXaWR0aCA9IDUwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFjdGl2aXR5UldpZHRoID0gNTA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudlRyYWNrVGV4dCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnZpZGVvUGF0aFsxXS50cmFja1R4dDsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwgNTAwKTsNCg0KICAgICAgICAgIHZhciBwYXRoID0gJGxvY2F0aW9uLnBhdGgoKTsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICRzY29wZS5nVGVtcGxhdGVVcmxBcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgaWYgKHBhdGggPT09ICRzY29wZS5nVGVtcGxhdGVVcmxBcnJheVswXS5zcGxpdCgnIycpLmpvaW4oJy8nKSkgew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgJHNjb3BlLmxvY2F0aW9uID0gIiMiICsgJGxvY2F0aW9uLnBhdGgoKS5zdWJzdHIoMSwgJGxvY2F0aW9uLnBhdGgoKS5sZW5ndGgpOw0KICAgICAgICAgIHZhciB0bXBJbmRleCA9IDA7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkc2NvcGUuZ1RlbXBsYXRlVXJsQXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZ1RlbXBsYXRlVXJsQXJyYXlbaV0gPT09ICRzY29wZS5sb2NhdGlvbikgew0KICAgICAgICAgICAgICAgICAgICB0bXBJbmRleCA9IGk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgIA0KICAgICAgICAgIC8vJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPSB0bXBJbmRleDsNCiAgICAgICAgICAvL2FsZXJ0KHRtcEluZGV4KQ0KCQkvL3NldFRpbWVvdXQoZnVuY3Rpb24oKXsNCgkJIA0KCQkNCgkJLy99LDIwMDApICANCgkJIA0KCQkgIA0KICAgICAgICAgICRzY29wZS5tYWtlQnV0dG9uTnVtYmVyQm9sZCh0bXBJbmRleCk7DQogICAgICAgICAgJHNjb3BlLmNoZWNrTmV4dEJhY2tTdGF0dXMoKTsNCiAgICAgICAgICB1cGRhdGVXaW5kb3dTaXplKCk7DQogICAgICAgICAgJHNjb3BlLmVuYWJsZU5leHRCYWNrU3RhdHVzKCk7DQogICAgIH0pOw0KDQogICAgIC8vLS0tLS0tIFRoaXMgZnVuY3Rpb24gY29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgR2xvYmFsIGNvbW1vbiB0ZXh0IGJ1dHRvbiAtLS0tLS0tLy8NCiAgICAgJHNjb3BlLnNob3dIaWRlVGV4dCA9IGZ1bmN0aW9uKF92YWwpDQogICAgIHsNCiAgICAgICAgICB2YXIgdW5pdFRpdGxlID0gJHNjb3BlLmdBY3Rpdml0eUluZm8udW5pdFRpdGxlOw0KICAgICAgICAgIHZhciBsZXNzb25UaXRsZSA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmxlc3NvblRpdGxlOw0KICAgICAgICAgIHZhciBsZXNzb25TdWJUaXRsZSA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmxlc3NvblN1YlRpdGxlOw0KICAgICAgICAgIHZhciBhY3Rpdml0eU51bWJlciA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmFjdGl2aXR5TnVtYmVyOw0KICAgICAgICAgIHZhciBhY3Rpdml0eVRpdGxlID0gJHNjb3BlLmdBY3Rpdml0eUluZm8uYWN0aXZpdHlUaXRsZTsNCiAgICAgICAgICB2YXIgYWN0aXZpdHlTdWJUaXRsZSA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmFjdGl2aXR5U3ViVGl0bGU7DQogICAgICAgICAgdmFyIGFjdGl2aXR5Rm9jdXMgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5hY3Rpdml0eUZvY3VzOw0KICAgICAgICAgIHZhciBoZWxwID0gJHNjb3BlLmdBY3Rpdml0eUluZm8uaGVscDsNCiAgICAgICAgICB2YXIgaGludCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmhpbnQ7DQogICAgICAgICAgdmFyIHJ1YnJpYyA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnJ1YnJpYzsNCg0KICAgICAgICAgIHN3aXRjaCAoX3ZhbCkgew0KICAgICAgICAgICAgICAgY2FzZSAndW5pdFRpdGxlJzoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzY29wZS5jaGVja0ZvcnVuZGVmaW5lZFR4dCh1bml0VGl0bGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2xlc3NvblRpdGxlJzoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzY29wZS5jaGVja0ZvcnVuZGVmaW5lZFR4dChsZXNzb25UaXRsZSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgY2FzZSAnbGVzc29uU3ViVGl0bGUnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGxlc3NvblN1YlRpdGxlKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICBjYXNlICdhY3Rpdml0eU51bWJlcic6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2NvcGUuY2hlY2tGb3J1bmRlZmluZWRUeHQoYWN0aXZpdHlOdW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2FjdGl2aXR5VGl0bGUnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGFjdGl2aXR5VGl0bGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2FjdGl2aXR5U3ViVGl0bGUnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGFjdGl2aXR5U3ViVGl0bGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2FjdGl2aXR5Rm9jdXMnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGFjdGl2aXR5Rm9jdXMpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2hlbHAnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGhlbHApOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2hpbnQnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGhpbnQpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ3J1YnJpYyc6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2NvcGUuY2hlY2tGb3J1bmRlZmluZWRUeHQocnVicmljKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgfQ0KICAgICB9Ow0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQogICAgIC8vLS0tLS0tLSBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgdGV4dCBpcyB1bmRlZmluZWQgb3IgTm90ICAtLS0tLS0tLy8NCiAgICAgJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0ID0gZnVuY3Rpb24oX3R4dCkNCiAgICAgew0KICAgICAgICAgIGlmIChfdHh0ICE9PSAidW5kZWZpbmVkIiAmJiBfdHh0ICE9PSB1bmRlZmluZWQgJiYgX3R4dCAhPT0gIiIpDQogICAgICAgICAgew0KICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICB9DQogICAgIH07DQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8gICAgDQoNCiAgICAgLy9icm9hZGNhc3QgYW5kIHdhaXQgdGlsbCB3ZSBnZXQgdGhlIHRpdGxlICYgY29udGVudCBmb3IgcG9wdXAgZnJvbSBjaGlsZC4uLgkNCiAgICAgJHNjb3BlLmxhdW5jaFBvcHVwQm94ID0gZnVuY3Rpb24odGl0bGUpIHsNCiAgICAgICAgICANCiAgICAgICAgICB2YXIgY29udGVudCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmFjdGl2aXR5Rm9jdXM7DQogICAgICAgICAgdmFyIGZpbGVQYXRoID0nJzsNCiAgICAgICAgICAkc2NvcGUuaXNTaG93UG9wdXAgPSBmYWxzZTsNCiAgICAgICAgICANCiAgICAgICAgICBpZiAodGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gImhpbnQiKSB7DQogICAgICAgICAgICAgICBjb250ZW50ID0gJHNjb3BlLmdBY3Rpdml0eUluZm8uaGludDsNCiAgICAgICAgICB9IGVsc2UgaWYgKHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09ICJoZWxwIikgew0KICAgICAgICAgICAgICAgY29udGVudCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmhlbHA7DQogICAgICAgICAgfQ0KICAgICAgICAgIHRlbXBfaWQgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby50ZW1wbGF0ZUlEOw0KICAgICAgICAgIHZhciBteVBvcHVwID0gIiNwb3B1cEFjdGl2aXR5Rm9jdXMiOw0KICAgICAgICAgIC8vYWxlcnQodGVtcF9pZCk7DQogICAgICAgICAgDQogICAgICAgICAgaWYgKHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09ICJoZWxwIikgew0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAkc2NvcGUucG9wdXBIZWxwQ29udGVudCA9IGNvbnRlbnQ7DQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIG15UG9wdXAgPSAiI3BvcHVwSGVscCI7DQogICAgICAgICAgICAgICB2YXIgaHRtbF9maWxlOw0KICAgICAgICAgICAgICAgaWYgKHRlbXBfaWQuc2VhcmNoKCJ0ZXh0X2VudHJ5IikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwMV90ZXh0X2VudHJ5IjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImRyb3Bkb3duIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwMl9kcm9wZG93biI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJkbmQiKSAhPSAtMSkNCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaHRtbF9maWxlID0gIjAzX2RyYWcmZHJvcCI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJyZW9yZGVyIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwNF9yZW9yZGVyIjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImNob2ljZSIpICE9IC0xKQ0KICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBodG1sX2ZpbGUgPSAiMDVfbXVsdGktY2hvaWNlIjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImNoZWNrYm94IikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwNl9jaGVja2JveCI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJ0ZXh0X2VkaXRfY29ycmVjdGlvbl8xIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwN19URUNfMV9idXR0b24iOw0KICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wX2lkLnNlYXJjaCgidGV4dF9lZGl0X2NvcnJlY3Rpb25fMyIpICE9IC0xKQ0KICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBodG1sX2ZpbGUgPSAiMDhfVEVDXzNfYnV0dG9ucyI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJ3b3Jkc2VhcmNoIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwOV93b3Jkc2VhcmNoIjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImNyb3Nzd29yZCIpICE9IC0xKQ0KICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBodG1sX2ZpbGUgPSAiMTBfY3Jvc3N3b3JkIjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImhpZ2hsaWdodGluZ19UZXh0IikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIxMV9oaWdobGlnaHQtdGV4dCI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJoaWdobGlnaHRpbmdfTVJRIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIxMl9oaWdobGlnaHQtc3lsbGFibGUiOw0KICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wX2lkLnNlYXJjaCgiY2F0ZWdvcnkiKSAhPSAtMSkNCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaHRtbF9maWxlID0gIjEzX2NhdGVnb3Jpc2luZyI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJzZW1pX29wZW5fd3JpdGluZyIpICE9IC0xKQ0KICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBodG1sX2ZpbGUgPSAiMTRfc2VtaS1vcGVuLXdyaXRpbmciOw0KICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wX2lkLnNlYXJjaCgiaW50cm8iKSAhPSAtMSkNCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaHRtbF9maWxlID0gIjE1X2ZyZWUtd3JpdGluZyI7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAkKG15UG9wdXApLmNzcygicGFkZGluZy10b3AiLCAiMTBweCIpOw0KICAgICAgICAgICAgICAgZmlsZVBhdGggPSAiaGVscF9maWxlcy8iICsgaHRtbF9maWxlICsgIi5odG1sIjsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgLy8kKG15UG9wdXApLmxvYWQoZmlsZVBhdGgpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIGlmICh0aXRsZS50b0xvd2VyQ2FzZSgpID09PSAiaGludCIpIHsNCiAgICAgICAgICAgICAgIC8vJHNjb3BlLnBvcHVwSGVscCA9IGNvbnRlbnQ7DQogICAgICAgICAgICAgICBteVBvcHVwID0gIiNwb3B1cEhpbnQiOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAvLyRzY29wZS5wb3B1cEFjdGl2aXR5Q29udGVudCA9IGNvbnRlbnQ7DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vICQobXlQb3B1cCkuZGlhbG9nKCJkZXN0cm95Iik7DQogICAgICAgICAgLy9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICBzaG93UG9wdXBCb3gobXlQb3B1cCwgZmlsZVBhdGgsIHRpdGxlLCBjb250ZW50KTsNCiAgICAgICAgIC8vIH0sNTAwKTsNCiAgICAgfTsNCg0KICAgICAkc2NvcGUuJG9uKCdhbnN3ZXJWYWxpZGF0ZWQnLCBmdW5jdGlvbihlLCByZXN1bHQpIHsNCiAgICAgICAgICAkc2NvcGUuY2hlY2tBdWRpb0FmdGVyQ2hlY2soKTsNCiAgICAgICAgICANCiAgICAgICAgICByZXN1bHQuaXNBbGxDb3JyZWN0ID0gdHJ1ZTsNCiAgICAgICAgICByZXN1bHQuY29ycmVjdENvdW50ID0gcmVzdWx0LnRvdGFsQ291bnQ7DQogICAgICAgICAgJHNjb3BlLmdGZWVkYmFja1RleHQgPSAiWW91ciBzY29yZSBpcyAiICsgcmVzdWx0LmNvcnJlY3RDb3VudCArICIvIiArIHJlc3VsdC50b3RhbENvdW50ICsgIi4iOw0KICAgICAgICAgICRzY29wZS5nRmVlZGJhY2tUaXRsZSA9ICIiOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIgPSB0cnVlOw0KICAgICAgICAgICRzY29wZS5nQ291cnNlQ29tcGxldGVkID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZW5hYmxlTmV4dEJhY2tTdGF0dXMoKTsNCiAgICAgICAgICAkc2NvcGUuZW5hYmxlTmV4dHBhZ2VbJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXJdID0gdHJ1ZTsNCiAgICAgICAgICANCiAgICAgICAgICByZXN1bHQuYWN0aXZpdHlJbmRleCA9ICRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyOw0KDQogICAgICAgICAgU2NvcmVTZXJ2aWNlLmFkZEF0KHJlc3VsdCwgcmVzdWx0LmFjdGl2aXR5SW5kZXgpOw0KICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7DQoNCiAgICAgICAgICB2YXIgcGVyU2NvcmUgPSAxMDA7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ3NlbmRTY29yZScsIHBlclNjb3JlKTsNCiAgICAgICAgICAkc2NvcGUuJGJyb2FkY2FzdCgnc2VuZENvdXJzZUNvbXBsZXRlZCcpOw0KDQogICAgICAgICAgDQogICAgICAgICAgdXBkYXRlV2luZG93U2l6ZSgpOw0KICAgICB9KTsNCg0KICAgICAkc2NvcGUuZmVlZGJhY2tPa0NsaWNrZWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICB2YXIgdG90YWxUZW1wbGF0ZUNvdW50ID0gJHNjb3BlLmFwcF9kYXRhLmFjdGl2aXRpdGVzLmxlbmd0aDsNCiAgICAgICAgICBpZiAocGFyZW50KSB7DQogICAgICAgICAgICAgICBpZiAocGFyZW50LkNVUFBsYXllcikgew0KICAgICAgICAgICAgICAgICAgICAvKiAgIENVUFBsYXllci5jaGtBY3Rpdml0eVN0YXR1cygpICovDQogICAgICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciA9PSB0b3RhbFRlbXBsYXRlQ291bnQpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuQ1VQUGxheWVyLmNoa0FjdGl2aXR5U3RhdHVzKDEpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgICRzY29wZS5nU2hvd0ZlZWRiYWNrQm94ID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLmdGaW5pc2hDbGlja2VkID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVTdGFydEFnYWluID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ29uRmluaXNoQ2xpY2tlZCcpOw0KICAgICAgICAgIC8vLS0tLS0tLS0gT24gRmluaXNoIEJ0biBOZXh0IHF1ZXN0aW9uL3BhZ2Ugd2lsbCBnZXQgZW5hYmxlZCAtLS0tLS0tLS0tLy8NCiAgICAgICAgICAkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZW5hYmxlTmV4dEJhY2tTdGF0dXMoKTsNCiAgICAgICAgICAkc2NvcGUuZW5hYmxlTmV4dHBhZ2VbJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXJdID0gdHJ1ZTsNCiAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCiAgICAgfTsNCg0KICAgICAkc2NvcGUuZmVlZGJhY2tDb3JyZWN0QW5zQ2xpY2tlZCA9IGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlQ2hlY2sgPSBmYWxzZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgJHNjb3BlLmdTaG93RmVlZGJhY2tCb3ggPSBmYWxzZTsNCiAgICAgICAgICAkc2NvcGUuJGJyb2FkY2FzdCgnb25Db3JyZWN0aW5nQW5zd2VycycpOw0KICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCdvbkhpZGVDb3JyZWN0QW5zd2VycycpOw0KICAgICAgICAgICRzY29wZS5nQ29ycmVjdEFuc3dlckRpc3BsYXllZCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIgPSB0cnVlOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVN0YXJ0QWdhaW4gPSBmYWxzZTsNCiAgICAgICAgICAkc2NvcGUuc2V0VGFiSW5kZXgoKTsNCiAgICAgfTsNCg0KICAgICAkc2NvcGUubGF1bmNoQ2hlY2tBbnN3ZXIgPSBmdW5jdGlvbihfZXZlbnQpIHsNCg0KICAgICAgICAgIHZhciBfdGFyZ2V0ID0gKF9ldmVudCkudGFyZ2V0Ow0KICAgICAgICAgICQoX3RhcmdldCkuYmx1cigpOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZUNoZWNrID0gdHJ1ZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU3RhcnRBZ2FpbiA9IHRydWU7DQogICAgICAgICAgJHNjb3BlLmdTaG93RmVlZGJhY2tCb3ggPSB0cnVlOw0KICAgICAgICAgICQoJy5mZWVkYmFjay1ib3gnKS5hcHBlbmRUbygnLmZlZWRiYWNrLWJveC1jb250YWluZXInKTsNCiAgICAgICAgICAkKCcuZmVlZGJhY2stYm94JykuY3NzKCd6SW5kZXgnLCA5OTk5KTsNCiAgICAgICAgICAvLy8vY29uc29sZS5sb2coJCgnLmZlZWRiYWNrLWJveCcpKQ0KICAgICAgICAgIGlmICgkc2NvcGUuZ0NvcnJlY3RBbnN3ZXJEaXNwbGF5ZWQgPT09IHRydWUpDQogICAgICAgICAgew0KICAgICAgICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9IHRydWU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgIC8qICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgJCgnI25leHRCdG4nKS5hZGRDbGFzcygnbmV4dCcpLnJlbW92ZUNsYXNzKCduZXh0RGlzYWJsZWQnKSAqLw0KICAgICAgICAgICAgICAgJHNjb3BlLmNoZWNrTmV4dEJhY2tTdGF0dXMoKQ0KICAgICAgICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9IGZhbHNlOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCdvbkNoZWNrQW5zd2VyJyk7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ3Jlc2V0QWxsSXRlbUF1ZGlvJywgbnVsbCk7DQoNCiAgICAgICAgICAvLyRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0ID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ3RvZ2dsZUF1ZGlvU2NyaXB0JywgZmFsc2UpOw0KDQogICAgICAgICAgJHNjb3BlLnJlbW92ZUFsbFRhYkluZGV4KCk7DQoNCiAgICAgICAgICAkKCIuaWNvRmVlZGJhY2tCdG4iKS5lYWNoKGZ1bmN0aW9uKGksIF9vYmopIHsNCiAgICAgICAgICAgICAgICQoX29iaikuYXR0cigidGFiaW5kZXgiLCAoNCArIGkpKTsNCiAgICAgICAgICB9KTsNCg0KICAgICAgICAgIHVwZGF0ZVdpbmRvd1NpemUoKTsNCg0KICAgICB9Ow0KDQogICAgICRzY29wZS5yZW1vdmVBbGxUYWJJbmRleCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICQoIi5pY28iKS5hdHRyKCJ0YWJpbmRleCIsIC0xKTsNCiAgICAgICAgICAkKCIuYm90dG9tTmF2RGl2IGJ1dHRvbiIpLmF0dHIoInRhYmluZGV4IiwgLTEpOw0KICAgICAgICAgICQoIi5pY29IZWxwIikuYXR0cigidGFiaW5kZXgiLCAtMSk7DQogICAgICAgICAgJCgiLmRlc2NyaXB0aW9uIikuYXR0cigidGFiaW5kZXgiLCAtMSk7DQogICAgICAgICAgJCgiLmhpbnQiKS5hdHRyKCJ0YWJpbmRleCIsIC0xKTsNCiAgICAgICAgICAkKCJzZWxlY3QiKS5hdHRyKCJ0YWJpbmRleCIsIC0xKTsNCiAgICAgICAgICAkKCJpbnB1dCIpLmF0dHIoInRhYmluZGV4IiwgLTEpOw0KICAgICAgICAgICQoImJ1dHRvbiIpLmF0dHIoInRhYmluZGV4IiwgLTEpOw0KICAgICB9Ow0KDQogICAgICRzY29wZS5zZXRUYWJJbmRleCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICQoIi5pY29IZWxwIikuYXR0cigidGFiaW5kZXgiLCAxKTsNCiAgICAgICAgICAkKCIuZGVzY3JpcHRpb24iKS5hdHRyKCJ0YWJpbmRleCIsIDEpOw0KICAgICAgICAgICQoIi5oaW50IikuYXR0cigidGFiaW5kZXgiLCAxKTsNCiAgICAgICAgICAkKCJzZWxlY3QiKS5hdHRyKCJ0YWJpbmRleCIsIDYpOw0KICAgICAgICAgICQoImlucHV0IikuYXR0cigidGFiaW5kZXgiLCA2KTsNCiAgICAgICAgICAkKCIuaWNvIikuYXR0cigidGFiaW5kZXgiLCA2KTsNCiAgICAgICAgICAkKCIuYm90dG9tTmF2RGl2IGJ1dHRvbiIpLmF0dHIoInRhYmluZGV4IiwgNik7DQogICAgIH07DQoNCiAgICAgJHNjb3BlLmxhdW5jaFNob3dBbnN3ZXIgPSBmdW5jdGlvbihfZXZlbnQpIHsNCiAgICAgICAgICB2YXIgX3RhcmdldCA9IChfZXZlbnQpLnRhcmdldDsNCiAgICAgICAgICAkKF90YXJnZXQpLmJsdXIoKTsNCiAgICAgICAgICBpZiAoISRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIpIHsNCiAgICAgICAgICAgICAgIHZhciB0b3RhbFRlbXBsYXRlQ291bnQgPSAkc2NvcGUuYXBwX2RhdGEuYWN0aXZpdGl0ZXMubGVuZ3RoOw0KICAgICAgICAgICAgICAgaWYgKHBhcmVudCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LkNVUFBsYXllcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgQ1VQUGxheWVyLmNoa0FjdGl2aXR5U3RhdHVzKCkgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPT0gdG90YWxUZW1wbGF0ZUNvdW50KQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5DVVBQbGF5ZXIuY2hrQWN0aXZpdHlTdGF0dXMoMSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9IHRydWU7DQogICAgICAgICAgICAgICAkc2NvcGUuZ1Nob3dGZWVkYmFja0JveCA9IGZhbHNlOw0KDQogICAgICAgICAgICAgICAvKiAkc2NvcGUuZ05leHRCdG5EaXNhYmxlZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICQoJyNuZXh0QnRuJykuYWRkQ2xhc3MoJ25leHQnKS5yZW1vdmVDbGFzcygnbmV4dERpc2FibGVkJykgICovDQogICAgICAgICAgICAgICAkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICRzY29wZS5lbmFibGVOZXh0QmFja1N0YXR1cygpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmVuYWJsZU5leHRwYWdlWyRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyXSA9IHRydWU7DQoNCiAgICAgICAgICAgICAgIC8vJHNjb3BlLmZlZWRiYWNrQ29ycmVjdEFuc0NsaWNrZWQoKTsgICAvLy0tIENvbW1lbnRlZCBvbiAwMy8wNC8yMDE0IC0tLy8NCiAgICAgICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCdvblNob3dDb3JyZWN0QW5zd2VycycpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdDb3JyZWN0QW5zd2VyRGlzcGxheWVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICRzY29wZS5nRGlzYWJsZUNoZWNrID0gdHJ1ZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVTdGFydEFnYWluID0gZmFsc2U7ICAvLy0tIEFkZGVkIG9uIDAzLzA0LzIwMTQgdG8gRW5hYmxlIFN0YXJ0IEFnYWluIGJ1dHR0b24gb24gY2xpY2sgLS0vLw0KICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgY2hlY2tCb3VuZHJpZXMoJ0hlbHBfRGlhbG9nQm94Jyk7DQogICAgICAgICAgICAgICAgICAgIGNoZWNrQm91bmRyaWVzKCdIaW50X0RpYWxvZ0JveCcpOw0KICAgICAgICAgICAgICAgICAgICBjaGVja0JvdW5kcmllcygnQWN0aXZpdHlfRGlhbG9nQm94Jyk7DQogICAgICAgICAgICAgICAgICAgIGNoZWNrQm91bmRyaWVzU2NyaXB0UG9wdXAoKTsNCiAgICAgICAgICAgICAgIH0sIDE1MDApOw0KICAgICAgICAgIH0NCiAgICAgICAgICB1cGRhdGVXaW5kb3dTaXplKCk7DQoNCiAgICAgfTsNCg0KICAgICAkc2NvcGUubGF1bmNoU3RhcnRBZ2FpbiA9IGZ1bmN0aW9uKF9ldmVudCkgew0KICAgICAgICAgIHZhciBfdGFyZ2V0ID0gKF9ldmVudCkudGFyZ2V0Ow0KICAgICAgICAgICQoX3RhcmdldCkuYmx1cigpOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXJQcmV2ID0gJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlcjsNCiAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVDaGVja1ByZXYgPSAkc2NvcGUuZ0Rpc2FibGVDaGVjazsNCiAgICAgICAgICAkc2NvcGUuZ1Nob3dTdGFydEFnYWluQm94ID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVTaG93QW5zd2VyID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVDaGVjayA9IHRydWU7DQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU3RhcnRBZ2FpbiA9IHRydWU7DQogICAgICAgICAgLy8gJHNjb3BlLnZpZGVvTGVmdFBhdGggPSAnJzsNCiAgICAgICAgICAvLyAkc2NvcGUudmlkZW9SaWdodFBhdGggPSAnJzsNCiAgICAgICAgICAvLyAkc2NvcGUuYXVkaW9QYXRoID0gJyc7DQogICAgICAgICAgLy8kKCcudWktZGlhbG9nJykuZHJhZ2dhYmxlKCJvcHRpb24iLCAiZGlzYWJsZWQiLCB0cnVlKTsNCiAgICAgICAgICAvLyQoJy51aS1kaWFsb2cnKS5kaWFsb2coIm9wdGlvbiIsICJyZXNpemFibGUiLCBmYWxzZSk7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ3Jlc2V0QWxsSXRlbUF1ZGlvJywgbnVsbCk7DQogICAgICAgICAgaWYgKCRzY29wZS5pdGVtQXVkaW8pIHsNCiAgICAgICAgICAgICAgICRzY29wZS5pdGVtQXVkaW8ualBsYXllcigic3RvcCIpOw0KICAgICAgICAgIH0NCiAgICAgICAgICAkc2NvcGUucmVtb3ZlQWxsVGFiSW5kZXgoKTsNCiAgICAgICAgICAkKCIuc3RhcnRBZ2Fpblllc05vIikuZWFjaChmdW5jdGlvbihpLCBfb2JqKSB7DQoNCiAgICAgICAgICAgICAgICQoX29iaikuZmluZCgiYnV0dG9uIikuYXR0cigidGFiaW5kZXgiLCAoNCArIGkpKTsNCiAgICAgICAgICB9KTsNCg0KICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCd0b2dnbGVBdWRpb1NjcmlwdCcsICRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0KTsNCg0KICAgICB9Ow0KICAgICAkc2NvcGUuJG9uKCdvbkl0ZW1BdWRpb1BsYXlTdGFydCcsIGZ1bmN0aW9uKGUsIG9iaikgew0KICAgICAgICAgICRzY29wZS5pdGVtQXVkaW8gPSBvYmo7DQogICAgIH0pOw0KDQoNCg0KICAgICAkc2NvcGUuc3RhcnRBZ2Fpbk9rQ2xpY2tlZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgIC8vVE9ETyBjbGVhbiB1cCBkYXRhIGFuZCByZWxvYWQgYWN0aXZpdHksIGZvciBub3cgbGV0J3MgcmVmcmVzaCB0aGUgd2luZG93DQogICAgICAgICAgLy93aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7DQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlQ2hlY2sgPSBmYWxzZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU3RhcnRBZ2FpbiA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nU2hvd0ZlZWRiYWNrQm94ID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLmdTaG93U3RhcnRBZ2FpbkJveCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIgPSB0cnVlOw0KICAgICAgICAgICRzY29wZS5nQ29ycmVjdEFuc3dlckRpc3BsYXllZCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nQ291cnNlQ29tcGxldGVkID0gZmFsc2U7DQogICAgICAgICAgJCgnI3BvcHVwSGludCcpLmRpYWxvZygiY2xvc2UiKTsNCiAgICAgICAgICAkKCcjcG9wdXBIZWxwJykuZGlhbG9nKCJjbG9zZSIpOw0KICAgICAgICAgICQoJyNwb3B1cEFjdGl2aXR5Rm9jdXMnKS5kaWFsb2coImNsb3NlIik7DQogICAgICAgICAgJCgiLnVpLWRpYWxvZyIpLmRpYWxvZygnY2xvc2UnKTsNCiAgICAgICAgICAkKCIudlBhbiIpLmRpYWxvZygnY2xvc2UnKTsNCiAgICAgICAgICAkKCIuYVBhbiIpLmRpYWxvZygnY2xvc2UnKTsNCg0KICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCdtYWtlQXVkaW9Wb2x1bWVUb0RlZmF1bHQnKTsgIC8vLS0gQWRkZWQgb24gMDQvMDYvMjAxNCAtLSBUbyBTZXQgQXVkaW8gVm9sdW1lIHRvIDAuNjggb24gU3RhcnQgQWdhaW4gT2sgQ2xpY2tlZCAtLS8vDQoNCiAgICAgICAgICAkc2NvcGUuc2V0VGFiSW5kZXgoKTsNCiAgICAgICAgICB2YXIgX3VybCA9ICgkc2NvcGUuZ1RlbXBsYXRlVXJsQXJyYXlbJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgLSAxXSkuc3BsaXQoIiMiKS5qb2luKCIvIik7DQogICAgICAgICAgJGxvY2F0aW9uLnBhdGgoX3VybCk7DQogICAgICAgICAgJHJvdXRlLnJlbG9hZCgpOw0KDQogICAgIH07DQogICAgICRzY29wZS5zdGFydEFnYWluQ2FuY2VsQ2xpY2tlZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICRzY29wZS5nU2hvd1N0YXJ0QWdhaW5Cb3ggPSBmYWxzZTsgICAgICAgDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9ICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXJQcmV2Ow0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZUNoZWNrID0gJHNjb3BlLmdEaXNhYmxlQ2hlY2tQcmV2Ow0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVN0YXJ0QWdhaW4gPSBmYWxzZTsNCiAgICAgICAgICAkKCcudWktZGlhbG9nJykuZHJhZ2dhYmxlKCJvcHRpb24iLCAiZGlzYWJsZWQiLCBmYWxzZSk7DQogICAgICAgICAgJHNjb3BlLnNldFRhYkluZGV4KCk7DQogICAgIH07DQoNCiAgICAgZnVuY3Rpb24gc2hvd1BvcHVwQm94KG15UG9wdXAsIGZpbGVQYXRoLCB0aXRsZSwgY29udGVudCkgew0KICAgICAgICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICB2YXIgX215UG9wdXAgPSBteVBvcHVwOy8vIiNwb3B1cEFjdGl2aXR5Rm9jdXMiOyANCiAgICAgICAgICANCiAgICAgICAgICBpZighJHNjb3BlLmlzU2hvd1BvcHVwKXsNCiAgICAgICAgICAgICAgICQobXlQb3B1cCkuZGlhbG9nKCJkZXN0cm95Iik7DQogICAgICAgICAgfQ0KICAgICAgICAgDQogICAgICAgIC8vIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgIC8vICBteVBvcHVwID0gIiNwb3B1cEFjdGl2aXR5Rm9jdXMiOyANCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgJChteVBvcHVwKS5kcmFnZ2FibGUoJ2VuYWJsZScpOw0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICBpZiAodGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gImhlbHAiKSB7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5wb3B1cEhlbHBDb250ZW50ID0gY29udGVudDsNCiAgICAgICAgICAgICAgICAgICAgbXlQb3B1cCA9ICIjcG9wdXBIZWxwIjsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIGVsc2UgaWYgKHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09ICJoaW50Iikgew0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUucG9wdXBIZWxwID0gY29udGVudDsNCiAgICAgICAgICAgICAgICAgICAgbXlQb3B1cCA9ICIjcG9wdXBIaW50IjsNCiAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5wb3B1cEFjdGl2aXR5Q29udGVudCA9IGNvbnRlbnQ7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8vICQobXlQb3B1cCkuZGlhbG9nKCJkZXN0cm95Iik7DQogICAgICAgICAgICAgICAvLyAkKG15UG9wdXApLmRpYWxvZygnZGVzdHJveScpLnJlbW92ZSgpDQogICAgICAgICAgICAgICAvLyB2YXIgcG9zRGl2PSAkKCcubG9uZ0F1ZGlvJykuZmluZCgnI3RQb3B1cEhvbGRlcicpDQoNCiAgICAgICAgICAgICAgIHZhciBkaXMgPSAkKCcjYXVkaW9QbGF5ZXJEaXYnKS5jc3MoJ2Rpc3BsYXknKTsNCiAgICAgICAgICAgICAgIHZhciBwb3NEaXY7DQogICAgICAgICAgICAgICBpZiAoZGlzID09PSAnYmxvY2snKSB7DQogICAgICAgICAgICAgICAgICAgIHBvc0RpdiA9ICQoJy5ydWJyaWNfYXVkaW9Db250cm9sbGVyX3RhYmxlJykuZmluZCgnLnRQb3B1cEhvbGRlcicpOw0KICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcG9zRGl2ID0gIiNwb3BQb3NpdGlvbjEiOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgLy9hbGVydCgkKHBvc0RpdikucG9zaXRpb24oKS50b3ApDQogICAgICAgICAgICAgICAkc2NvcGUucG9wdXBDb250ZW50ID0gY29udGVudDsNCiAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSB0aXRsZSArICJfRGlhbG9nQm94IjsNCiAgICAgICAgICAgICAgIHZhciBkaWFsb2cgPSAkKCcuJyArIGNsYXNzTmFtZSk7DQoNCiAgICAgICAgICAgICAgICQobXlQb3B1cCkuZGlhbG9nKHsNCiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxLA0KICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsDQogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMzAwLA0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjb250ZW50LA0KICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6ICdhdXRvJywNCiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDk0MSwNCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3M6IGNsYXNzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kVG86ICIjcG9wUG9zaXRpb24xIiwNCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBteTogJ2xlZnQgdG9wJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBhdDogJ2xlZnQgdG9wJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBvZjogJChwb3NEaXYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbjogJ25vbmUnDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIG9wZW46IGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5odG1sKGNvbnRlbnQpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICBpZighJHNjb3BlLmlzU2hvd1BvcHVwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpbGVQYXRoIT0nJyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobXlQb3B1cCkubG9hZChmaWxlUGF0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICQodGhpcykucGFyZW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5pc1Nob3dQb3B1cCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dQb3B1cEJveChteVBvcHVwLCBmaWxlUGF0aCwgdGl0bGUsIGNvbnRlbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RpYWxvZy5kcmFnZ2FibGUoIm9wdGlvbiIsICJjb250YWlubWVudCIsICcjYm91bmRhcnknKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRHJhZ0V2ZW50T25Qb3B1cChteVBvcHVwLCBkaWFsb2csIGNsYXNzTmFtZSwgIm9wdGlvbiIsICJjb250YWlubWVudCIsICcjYm91bmRhcnknKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSw1MDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgc2hvdzogew0KICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdDogJ2ZhZGUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkOiAxMDANCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgaGlkZTogew0KICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdDogJ2ZhZGUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkOiAxMDANCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgcmVzaXplOiBmdW5jdGlvbihldmVudCwgdWkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJXcmFwcGVyIEhlaWdodDogIiskKCcjd3JhcHBlcicpLmhlaWdodCgpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgIGFkZERyYWdFdmVudE9uUG9wdXAobXlQb3B1cCwgZGlhbG9nLCBjbGFzc05hbWUsICJvcHRpb24iLCAiY29udGFpbm1lbnQiLCAnI2JvdW5kYXJ5Jyk7DQogICAgICAgICAgICAgICANCiAgICAgICAgIC8vIH0sIDUwMCk7DQogICAgIH0NCg0KICAgICBmdW5jdGlvbiBhZGREcmFnRXZlbnRPblBvcHVwKG15UG9wdXAsIGRpYWxvZywgY2xhc3NOYW1lLCBvcHRpb24sIGNvbnRhaW5tZW50LCBib3VuZGFyeSkgew0KICAgICAgICAgIA0KICAgICAgICAgIHRyeXsNCiAgICAgICAgICAgICAgIHZhciBiID0gZ2V0RGlhbG9nQm91bmRhcnkoJChteVBvcHVwKS5wYXJlbnQoKSk7DQogICAgICAgICAgICAgICB2YXIgZGlhbG9nID0gJCgnLicgKyBjbGFzc05hbWUpOw0KICAgICAgICAgICAgICAgaWYgKGIuY3VycmVudEJvdHRvbVBvcyA+IGIubWF4Qm90dG9tTGltaXQpIHsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgZGlmID0gYi5jdXJyZW50Qm90dG9tUG9zIC0gYi5tYXhCb3R0b21MaW1pdDsNCiAgICAgICAgICAgICAgICAgICAgJChteVBvcHVwKS5wYXJlbnQoKS5jc3MoJ3RvcCcsICQobXlQb3B1cCkucGFyZW50KCkub2Zmc2V0KCkudG9wIC0gNSk7DQogICAgICAgICAgICAgICAgICAgIGIgPSBnZXREaWFsb2dCb3VuZGFyeSgkKG15UG9wdXApLnBhcmVudCgpKTsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIGlmIChiLmN1cnJlbnRSaWdodFBvcyA+IGIubWF4UmlnaHRMaW1pdCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZGlmID0gYi5jdXJyZW50UmlnaHRQb3MgLSBiLm1heFJpZ2h0TGltaXQ7DQogICAgICAgICAgICAgICAgICAgICQobXlQb3B1cCkucGFyZW50KCkuY3NzKCdsZWZ0JywgJChteVBvcHVwKS5wYXJlbnQoKS5vZmZzZXQoKS5sZWZ0IC0gZGlmKTsNCiAgICAgICAgICAgICAgICAgICAgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQobXlQb3B1cCkucGFyZW50KCkpOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgZGlhbG9nLmRyYWdnYWJsZShvcHRpb24sIGNvbnRhaW5tZW50LCBib3VuZGFyeSk7DQogICAgICAgICAgICAgICAkKGRpYWxvZykub24oImRyYWciLCBmdW5jdGlvbihldmVudCwgdWkpIHsNCiAgICAgICAgICAgICAgICAgICAgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQobXlQb3B1cCkucGFyZW50KCkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKGIuY3VycmVudEJvdHRvbVBvcyA8IGIubWF4Qm90dG9tTGltaXQpICYmIChiLmN1cnJlbnRSaWdodFBvcyA8IGIubWF4UmlnaHRMaW1pdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAkKG15UG9wdXApLmRpYWxvZyhvcHRpb24sICJyZXNpemFibGUiLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YXIgZVRvcCA9IHVpLm9mZnNldC50b3A7DQogICAgICAgICAgICAgICAgICAgIHZhciBjb250ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lV2luZG93ID0gZG9jdW1lbnQucGFyZW50V2luZG93IHx8IGRvY3VtZW50LmRlZmF1bHRWaWV3Ow0KICAgICAgICAgICAgICAgICAgICB2YXIgYWN1bUZyYW1lVG9wID0gMDsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lV2luZG93LmxvY2F0aW9uLmhyZWYgIT0gdG9wLmxvY2F0aW9uLmhyZWYgJiYgY29udCA8IDUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lRWwgPSAkKGZyYW1lV2luZG93LmZyYW1lRWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoZnJhbWVFbCkub2Zmc2V0KCkgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lVG9wID0gJChmcmFtZUVsKS5vZmZzZXQoKS50b3A7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3VtRnJhbWVUb3AgKz0gZnJhbWVUb3A7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lV2luZG93ID0gZnJhbWVXaW5kb3cucGFyZW50LmRvY3VtZW50LnBhcmVudFdpbmRvdyB8fCBmcmFtZVdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGVmYXVsdFZpZXc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIHRvdGFsVG9wID0gYWN1bUZyYW1lVG9wICsgZVRvcCArIDcwOw0KDQogICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICQobXlQb3B1cCkuYmluZCgiZGlhbG9ncmVzaXplc3RvcCIsIGZ1bmN0aW9uKGV2ZW50LCB1aSkgew0KDQogICAgICAgICAgICAgICAgICAgIC8vJCgnI3dyYXBwZXInKS5jc3MoJ21pbi1oZWlnaHQnLDEyNDkpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQobXlQb3B1cCkucGFyZW50KCkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYi5jdXJyZW50Qm90dG9tUG9zID4gYi5tYXhCb3R0b21MaW1pdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWYgPSBiLmN1cnJlbnRCb3R0b21Qb3MgLSBiLm1heEJvdHRvbUxpbWl0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vCSQobXlQb3B1cCkucGFyZW50KCkuY3NzKCd0b3AnLCAkKG15UG9wdXApLnBhcmVudCgpLm9mZnNldCgpLnRvcCArIGRpZik7DQogICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQobXlQb3B1cCkucGFyZW50KCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoYi5jdXJyZW50UmlnaHRQb3MpID4gTnVtYmVyKGIubWF4UmlnaHRMaW1pdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlmID0gYi5jdXJyZW50UmlnaHRQb3MgLSBiLm1heFJpZ2h0TGltaXQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgJChteVBvcHVwKS5wYXJlbnQoKS5jc3MoJ2xlZnQnLCAkKG15UG9wdXApLnBhcmVudCgpLm9mZnNldCgpLmxlZnQgLSBkaWYpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciBkaWFsb2cgPSAkKCcuJyArIGNsYXNzTmFtZSk7DQogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5kcmFnZ2FibGUob3B0aW9uLCBjb250YWlubWVudCwgYm91bmRhcnkpOw0KICAgICAgICAgICAgICAgICAgICAvL2RpYWxvZy5kcmFnZ2FibGUoIm9wdGlvbiIsICJjb250YWlubWVudCIsICcjYm91bmRhcnknKTsNCiAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAkKG15UG9wdXApLmJpbmQoImRpYWxvZ3Jlc2l6ZSIsIGZ1bmN0aW9uKGV2ZW50LCB1aSkgew0KICAgICAgICAgICAgICAgICAgICAvLyQoJyN3cmFwcGVyJykuY3NzKCdtYXgtaGVpZ2h0JywxMjQ5KTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBnZXREaWFsb2dCb3VuZGFyeSgkKG15UG9wdXApLnBhcmVudCgpKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGRpYWxvZyA9ICQoJy4nICsgY2xhc3NOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmRyYWdnYWJsZShvcHRpb24sIGNvbnRhaW5tZW50LCBib3VuZGFyeSk7DQogICAgICAgICAgICAgICAgICAgIC8vZGlhbG9nLmRyYWdnYWJsZSgib3B0aW9uIiwgImNvbnRhaW5tZW50IiwgJyNib3VuZGFyeScpOw0KICAgICAgICAgICAgICAgICAgICAvL2NoYW5nZXMgaGVyZSBBTklMDQogICAgICAgICAgICAgICAgICAgIC8vJCgiLmR1bW15IikuaHRtbChiLmN1cnJlbnRCb3R0b21Qb3MgKyIgLS0gIisgYi5tYXhCb3R0b21MaW1pdCsiICAtLS0gZGlhbG9nLmhlaWdodCAiK051bWJlcihkaWFsb2cuaGVpZ2h0KCktODApKQ0KICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGRpYWxvZy5oZWlnaHQoKSAtIDgwKSA+IDgwMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNwb3B1cEhlbHAnKS5jc3MoJ2hlaWdodCcsICI4ODUiKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjcG9wdXBIZWxwJykuY3NzKCdoZWlnaHQnLCBOdW1iZXIoZGlhbG9nLmhlaWdodCgpIC0gODApKTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgY3VyclRvcFBvczsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJIZWlnaHQ7DQogICAgICAgICAgICAgICAgICAgICQoIi5kdW1teSIpLmh0bWwoY3VyclRvcFBvcyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChiLmN1cnJlbnRCb3R0b21Qb3MgPj0gYi5tYXhCb3R0b21MaW1pdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ21vdXNldXAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNpemFibGUgPSAkKHRoaXMpLmRpYWxvZyhvcHRpb24sICJyZXNpemFibGUiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJUb3BQb3MgPSAkKG15UG9wdXApLm9mZnNldCgpLnRvcDsNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclRvcFBvcyA8IDApIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY3NzKCd0b3AnLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kaWFsb2cob3B0aW9uLCAiaGVpZ2h0IiwgKChiLm1heEJvdHRvbUxpbWl0IC0gY3VyclRvcFBvcykpICsgMTYgKyAkKGJvdW5kYXJ5KS5vZmZzZXQoKS50b3ApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzaXphYmxlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJMZWZ0UG9zOw0KICAgICAgICAgICAgICAgICAgICB2YXIgY3VycldpZHRoOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChiLmN1cnJlbnRSaWdodFBvcyA+PSBiLm1heFJpZ2h0TGltaXQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyclRvcFBvcyA9ICQobXlQb3B1cCkub2Zmc2V0KCkudG9wOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJUb3BQb3MgPCAwKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmNzcygndG9wJywgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAkKHRoaXMpLnRyaWdnZXIoJ21vdXNldXAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNpemFibGUgPSAkKHRoaXMpLmRpYWxvZyhvcHRpb24sICJyZXNpemFibGUiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJMZWZ0UG9zID0gJChteVBvcHVwKS5wYXJlbnQoKS5vZmZzZXQoKS5sZWZ0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kaWFsb2cob3B0aW9uLCAid2lkdGgiLCAoKDk2MCAtIGN1cnJMZWZ0UG9zKSAtIDE3ICsgJChib3VuZGFyeSkub2Zmc2V0KCkubGVmdCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2l6YWJsZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIC8vIGRpYWxvZy5kcmFnZ2FibGUoIm9wdGlvbiIsICJjb250YWlubWVudCIsICcjYm91bmRhcnknKTsNCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmRyYWdnYWJsZShvcHRpb24sIGNvbnRhaW5tZW50LCBib3VuZGFyeSk7DQogICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgIH1jYXRjaChlKXsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgIH0NCiAgICAgfQ0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vICAgIA0KDQogICAgIC8vLS0gQWRkZWQgb24gMDQvMDQvMjAxNCBUaGlzIGZ1bmN0aW9uIHdpbGwgYXNzaWduIFF1ZXN0aW9uIGF1ZGlvcGF0aCB0byBBdWlvUGxheWVyIC0tLy8NCiAgICAgJHNjb3BlLmFzc2lnblF1ZXN0aW9uQXVkaW9Ub1BsYXllciA9IGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoICE9PSB1bmRlZmluZWQgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGggIT09ICJ1bmRlZmluZWQiICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoICE9PSAiIikgew0KDQogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSB1bmRlZmluZWQgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSAiIikgew0KDQogICAgICAgICAgICAgICAgICAgICRzY29wZS5hdWRpb1BhdGggPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aFswXS5hdWRpb1BhdGg7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS50cmFja1RleHQgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aFswXS50cmFja1R4dDsNCg0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IHRydWU7DQogICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IGZhbHNlOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IGZhbHNlOw0KICAgICAgICAgIH0NCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KDQogICAgIC8vLS0gQWRkZWQgb24gMTAvMDQvMjAxNCBUaGlzIGZ1bmN0aW9uIHdpbGwgYm9sZCB0aGUgQm90dG9tIFRlbXBsYXRlIE51bWJlciBCb2xkIG9uIGNsaWNrIC0tLy8NCiAgICAgJHNjb3BlLm9uQ2xpY2tPZkFuY2hvciA9IGZ1bmN0aW9uKF9pbmRleCkgew0KICAgICAgICAgIGlmICgkc2NvcGUuZW5hYmxlTmV4dHBhZ2VbX2luZGV4XSA9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLmVuYWJsZU5leHRwYWdlW19pbmRleF0gPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgdmFyIF90YXJnZXQgPSAkKCIjYm90dG9tTmF2VWwiKS5maW5kKCdsaScpLmVxKF9pbmRleCkuZmluZCgnYnV0dG9uJyk7DQoNCiAgICAgICAgICAgICAgICRzY29wZS5mbmFtZSA9ICRzY29wZS5nVGVtcGxhdGVVcmxBcnJheVtfaW5kZXhdOw0KDQogICAgICAgICAgICAgICAkKF90YXJnZXQpLmJsdXIoKTsNCg0KICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyID09PSBfaW5kZXggKyAxKSB7DQogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoInNkc2FkcyIpDQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXI9ZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIC8vJHNjb3BlLmF1ZGlvUGF0aD0nJzsNCiAgICAgICAgICAgICAgICAgICAgLy8kc2NvcGUubWFrZUJ1dHRvbk51bWJlckJvbGQoX2luZGV4KTsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnZpZGVvUG9zaXRpb24gPSAiIjsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPSBfaW5kZXggKyAxOw0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY2hlY2tOZXh0QmFja1N0YXR1cygpOw0KDQogICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgIHZhciBfdXJsID0gKCRzY29wZS5nVGVtcGxhdGVVcmxBcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdKS5zcGxpdCgiIyIpLmpvaW4oIi8iKTsNCiAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKF91cmwpOw0KICAgICAgICAgIH0NCg0KDQogICAgIH07DQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8gICAgDQoNCiAgICAgLy8tLSBBZGRlZCBvbiAxMC8wNC8yMDE0IFRoaXMgZnVuY3Rpb24gd2lsbCBib2xkIHRoZSBCb3R0b20gVGVtcGxhdGUgTnVtYmVyIEJvbGQgb24gY2xpY2sgLS0vLw0KICAgICAkc2NvcGUubWFrZUJ1dHRvbk51bWJlckJvbGQgPSBmdW5jdGlvbihfaW5kZXgpIHsNCiAgICAgICAgICAkc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciA9IF9pbmRleCArIDE7DQogICAgICAgICAgLyogYWxlcnQoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIpICovDQogICAgICAgICAgJCgiI2JvdHRvbU5hdlVsIikuZmluZCgnbGknKS5jc3MoJ2ZvbnQtd2VpZ2h0JywgJ25vcm1hbCcpOw0KICAgICAgICAgICQoImJ1dHRvbi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7DQogICAgICAgICAgdmFyIF90YXJnZXQgPSAkKCIjYm90dG9tTmF2VWwiKS5maW5kKCdsaScpLmVxKF9pbmRleCkuZmluZCgnYnV0dG9uJyk7DQogICAgICAgICAgJChfdGFyZ2V0KS5hZGRDbGFzcygiYWN0aXZlIik7DQogICAgIH07DQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8gICANCg0KICAgICAvLy0tIEFkZGVkIG9uIDEwLzA0LzIwMTQgVGhpcyBmdW5jdGlvbiB3aWxsIGJvbGQgdGhlIEJvdHRvbSBUZW1wbGF0ZSBOdW1iZXIgQm9sZCBvbiBjbGljayAtLS8vDQogICAgICRzY29wZS5vbkNsaWNrT2ZOZXh0QmFjayA9IGZ1bmN0aW9uKCRldmVudCwgX3N0cikgew0KICAgICAgICAgIHZhciB0b3RhbFRlbXBsYXRlQ291bnQgPSAkc2NvcGUuYXBwX2RhdGEuYWN0aXZpdGl0ZXMubGVuZ3RoOw0KICAgICAgICAgIHZhciBhVGFnT2JqID0gJGV2ZW50LnRhcmdldDsNCiAgICAgICAgICAkKCIuYm90dG9tTmF2RGl2IC5uYXYtYnRuIikuYmx1cigpOw0KICAgICAgICAgIGlmIChfc3RyID09PSAnYmFjaycpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyLS07DQogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPD0gMSkgew0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciA9IDE7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIGlmIChfc3RyID09PSAnbmV4dCcpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyKys7DQogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPj0gKHRvdGFsVGVtcGxhdGVDb3VudCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPSB0b3RhbFRlbXBsYXRlQ291bnQ7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgICRzY29wZS5jaGVja05leHRCYWNrU3RhdHVzKCk7DQogICAgICAgICAgJHNjb3BlLm1ha2VCdXR0b25OdW1iZXJCb2xkKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyIC0gMSk7DQogICAgICAgICAgJHNjb3BlLmZuYW1lID0gJHNjb3BlLmdUZW1wbGF0ZVVybEFycmF5WyRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyIC0gMV07DQogICAgICAgICAgLy8gJChhVGFnT2JqKS5wcm9wKCdocmVmJywgJHNjb3BlLmdUZW1wbGF0ZVVybEFycmF5WyRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyIC0gMV0pOw0KICAgICAgICAgIHZhciBfdXJsID0gKCRzY29wZS5nVGVtcGxhdGVVcmxBcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdKS5zcGxpdCgiIyIpLmpvaW4oIi8iKTsNCiAgICAgICAgICAkc2NvcGUudmlkZW9MZWZ0UGF0aCA9ICcnOw0KICAgICAgICAgICRzY29wZS52aWRlb1JpZ2h0UGF0aCA9ICcnOw0KICAgICAgICAgICRzY29wZS5hdWRpb1BhdGggPSAnJzsNCiAgICAgICAgICAkbG9jYXRpb24ucGF0aChfdXJsKTsNCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KDQogICAgIC8vLS0gQWRkZWQgb24gMTAvMDQvMjAxNCBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgc3RhdHVzIG9mIE5leHQgQmFjayBCdXR0b24gYmFzZWQgb24gZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtLS8vDQogICAgICRzY29wZS5jaGVja05leHRCYWNrU3RhdHVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgdmFyIHRvdGFsVGVtcGxhdGVDb3VudCA9ICRzY29wZS5hcHBfZGF0YS5hY3Rpdml0aXRlcy5sZW5ndGg7DQoNCiAgICAgICAgICBpZiAoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPiAxKSB7DQogICAgICAgICAgICAgICAkKCcjYmFja0J0bicpLnJlbW92ZUNsYXNzKCdiYWNrRGlzYWJsZWQnKTsNCiAgICAgICAgICAgICAgICQoJyNiYWNrQnRuJykuYWRkQ2xhc3MoJ2JhY2snKTsNCiAgICAgICAgICAgICAgICQoJyNuZXh0QnRuJykuYWRkQ2xhc3MoJ25leHREaXNhYmxlZCcpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdCYWNrQnRuRGlzYWJsZWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyIDw9IDEpIHsNCiAgICAgICAgICAgICAgICQoJyNiYWNrQnRuJykucmVtb3ZlQ2xhc3MoJ2JhY2snKS5hZGRDbGFzcygnYmFja0Rpc2FibGVkJyk7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLmFkZENsYXNzKCduZXh0RGlzYWJsZWQnKTsNCiAgICAgICAgICAgICAgICRzY29wZS5nQmFja0J0bkRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyID49ICh0b3RhbFRlbXBsYXRlQ291bnQpKSB7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLnJlbW92ZUNsYXNzKCduZXh0JykuYWRkQ2xhc3MoJ25leHREaXNhYmxlZCcpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdCYWNrQnRuRGlzYWJsZWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gZmFsc2U7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgIC8vICAkKCcjbmV4dEJ0bicpLnJlbW92ZUNsYXNzKCduZXh0RGlzYWJsZWQnKS5hZGRDbGFzcygnbmV4dCcpOw0KICAgICAgICAgIH0NCg0KLy8gICAgICAgICRzY29wZS5hdWRpb1BhdGggPSAiIjsNCi8vCSRzY29wZS50cmFja1RleHQgPSIiOw0KLy8JJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPSBmYWxzZTsNCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLyAgIA0KDQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWRkZWQgb24gMjcvMDgvMjAxNCBUaGlzIGZ1bmN0aW9uIHdpbGwgZW5hYmxlIG9mIE5leHQgQmFjayBCdXR0b24gYmFzZWQgb24gc2hvd0Fuc3dlciAvLyAgIA0KICAgICAkc2NvcGUuZW5hYmxlTmV4dEJhY2tTdGF0dXMgPSBmdW5jdGlvbigpIHsNCg0KICAgICAgICAgIHZhciB0b3RhbFRlbXBsYXRlQ291bnQgPSAkc2NvcGUuYXBwX2RhdGEuYWN0aXZpdGl0ZXMubGVuZ3RoOw0KICAgICAgICAgIGlmICgkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID09IHRydWUpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gZmFsc2U7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLmFkZENsYXNzKCduZXh0JykucmVtb3ZlQ2xhc3MoJ25leHREaXNhYmxlZCcpDQogICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLnJlbW92ZUNsYXNzKCduZXh0JykuYWRkQ2xhc3MoJ25leHREaXNhYmxlZCcpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdOZXh0QnRuRGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICAgIH0NCg0KDQogICAgICAgICAgaWYgKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyID49ICh0b3RhbFRlbXBsYXRlQ291bnQpKSB7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLnJlbW92ZUNsYXNzKCduZXh0JykuYWRkQ2xhc3MoJ25leHREaXNhYmxlZCcpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdOZXh0QnRuRGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8qIGlmKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyPT0gdG90YWxUZW1wbGF0ZUNvdW50KQ0KICAgICAgICAgICB7DQogICAgICAgICAgIHBhcmVudC5DVVBQbGF5ZXIuY2hrQWN0aXZpdHlTdGF0dXMoMSk7DQogICAgICAgICAgIH0gKi8NCg0KICAgICB9DQoNCg0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQoNCiAgICAgJHNjb3BlLiRvbignb25QbGF5ZXJIZWlnaHRJbmNyZWFzZScsIGZ1bmN0aW9uKGUsIG9iaikgew0KICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAkKCIudWktZGlhbG9nLWNvbnRlbnQ6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBkaWFsb2cgPSAkKHRoaXMpLmRhdGEoImRpYWxvZyIpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wdGlvbnMuYXV0b1JlcG9zaXRpb24pIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vZGlhbG9nLm9wdGlvbigicG9zaXRpb24iLCBkaWFsb2cub3B0aW9ucy5wb3NpdGlvbik7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgIC8vIGNoZWNrQm91bmRyaWVzKCdIaW50X0RpYWxvZ0JveCcpOw0KICAgICAgICAgICAgICAgY2hlY2tCb3VuZHJpZXMoJ0hlbHBfRGlhbG9nQm94Jyk7DQogICAgICAgICAgICAgICAvLyBjaGVja0JvdW5kcmllc1NjcmlwdFBvcHVwKCk7DQogICAgICAgICAgfSwgMTAwKQ0KICAgICAgICAgIHVwZGF0ZVdpbmRvd1NpemUoKTsNCiAgICAgfSk7DQoNCiAgICAgLy8tLSBBZGRlZCBvbiAxOC8wOC8yMDE0IFRoaXMgZnVuY3Rpb24gd2lsbCBhc3NpZ24gUXVlc3Rpb24gYXVkaW9wYXRoIEF0ZXIgQ2hlY2sgQnV0dG9uIENsaWNrZWQgdG8gQXVpb1BsYXllciAtLS8vDQogICAgICRzY29wZS5jaGVja0F1ZGlvQWZ0ZXJDaGVjayA9IGZ1bmN0aW9uKCkgew0KDQoNCiAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGggIT09IHVuZGVmaW5lZCAmJiAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gInVuZGVmaW5lZCIgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGggIT09ICIiICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoLmxlbmd0aCA9PT0gMikgew0KICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzFdLmF1ZGlvUGF0aCAhPT0gdW5kZWZpbmVkICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzFdLmF1ZGlvUGF0aCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmF1ZGlvUGF0aCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzFdLmF1ZGlvUGF0aDsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRyYWNrVGV4dCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzFdLnRyYWNrVHh0Ow0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0ID0gZmFsc2U7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gdW5kZWZpbmVkICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoICE9PSAidW5kZWZpbmVkIiAmJiAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gIiIgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGgubGVuZ3RoID09PSAxKSB7DQogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSB1bmRlZmluZWQgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSAiIikgew0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0ID0gZmFsc2U7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KDQoNCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KDQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KICAgICAkc2NvcGUuYXNzaWduUGFnZUNvbXBsZXRpb25BcnJheSA9IGZ1bmN0aW9uKF9sZW4pIHsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9sZW47IGkrKykgew0KICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnBhZ2VDb21wbGV0aW9uQXJyYXlbaV0gPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVuYWJsZU5leHRwYWdlW2ldID0gdHJ1ZTsNCiAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5wYWdlQ29tcGxldGlvbkFycmF5W2ldID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmFibGVOZXh0cGFnZVtpXSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KDQogICAgIC8vLS0gRnVuY3Rpb24gd2lsbCBhcHBseSBIYW5kQ3Vyc29yIGJhc2VkIG9uIENvbXBsZXRpb24gb2YgUGFnZSAtLS8vDQogICAgICRzY29wZS5jaGVja0ZvckhhbmRDdXJzb3IgPSBmdW5jdGlvbihfaW5kZXgpIHsNCiAgICAgICAgICB2YXIgc3R5bGU7DQogICAgICAgICAgaWYgKCRzY29wZS5lbmFibGVOZXh0cGFnZVtfaW5kZXhdID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgc3R5bGUgPSB7J2N1cnNvcic6ICdkZWZhdWx0J307DQogICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7DQogICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUuZW5hYmxlTmV4dHBhZ2VbX2luZGV4XSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgc3R5bGUgPSB7J2N1cnNvcic6ICdwb2ludGVyJ307DQogICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7DQogICAgICAgICAgfQ0KICAgICB9Ow0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQoNCn0pOw0KDQokLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5hdXRvUmVwb3NpdGlvbiA9IHRydWU7DQokKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCkgew0KICAgICAkKCIudWktZGlhbG9nLWNvbnRlbnQ6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICAgICAgdmFyIGRpYWxvZyA9ICQodGhpcykuZGF0YSgiZGlhbG9nIik7DQogICAgICAgICAgaWYgKGRpYWxvZy5vcHRpb25zLmF1dG9SZXBvc2l0aW9uKSB7DQogICAgICAgICAgICAgICBkaWFsb2cub3B0aW9uKCJwb3NpdGlvbiIsIGRpYWxvZy5vcHRpb25zLnBvc2l0aW9uKTsNCg0KICAgICAgICAgIH0NCiAgICAgfSk7DQogICAgIGNoZWNrQm91bmRyaWVzKCdIZWxwX0RpYWxvZ0JveCcpOw0KDQp9KTsNCnZhciB0aW1lcjsNCmNudCA9IDA7DQp2YXIgcHJldkhlaWdodCA9IDA7DQp2YXIgaW50ZXJ2YWxJZCA9IG51bGw7DQpmdW5jdGlvbiB1cGRhdGVXaW5kb3dTaXplKCkgew0KICAgICB2YXIgbWFwcGVkRnJhbWUgPSBudWxsOw0KICAgICBpZiAodG9wKSB7DQogICAgICAgICAgbWFwcGVkRnJhbWUgPSB0b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnQtaWZyYW1lJyk7DQogICAgIH0NCiAgICAgaWYgKGludGVydmFsSWQpIHsNCiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpDQogICAgIH0NCiAgICAgaWYgKG1hcHBlZEZyYW1lKSB7DQogICAgICAgICAgY250ID0gMDsNCiAgICAgICAgICAvLyQoJyNkZWJ1ZycpLmh0bWwobWFwcGVkRnJhbWUudG9TdHJpbmcoKSArIjxicj4iKQ0KICAgICAgICAgIGlmICh0aW1lcikgew0KICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsNCiAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgc2V0SWZyYW1lSGVpZ2h0KG1hcHBlZEZyYW1lKTsNCiAgICAgICAgICB9LCAxMDAwKQ0KICAgICB9DQp9DQoNCmZ1bmN0aW9uIGdldERvY0hlaWdodChkb2MpIHsNCn0NCg0KZnVuY3Rpb24gc2V0SWZyYW1lSGVpZ2h0KGlmcm0pIHsNCiAgICAgdmFyIHNlY2hlaWdodCA9ICQoJyNzZWMnKS5oZWlnaHQoKTsNCiAgICAgLy9jb25zb2xlLmxvZyhzZWNoZWlnaHQpDQogICAgIGludGVydmFsSWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgICAgICAgICBpZiAocHJldkhlaWdodCAhPSBzZWNoZWlnaHQpDQogICAgICAgICAgew0KICAgICAgICAgICAgICAgY250ID0gMDsNCiAgICAgICAgICAgICAgIHZhciBvZmZzZXRGaXggPSA0MA0KICAgICAgICAgICAgICAgdmFyIG1pbklmcmFtZUhlaWdodCA9IDUxMDsgLy8gRGVmYXVsdCBoZWlnaHQgb2YgdGhlIGRvYyBvYmplY3QNCiAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBNYXRoLm1heChzZWNoZWlnaHQsIG1pbklmcmFtZUhlaWdodCkgKyBvZmZzZXRGaXg7DQogICAgICAgICAgICAgICB2YXIgZG9jID0gaWZybS5jb250ZW50RG9jdW1lbnQgPyBpZnJtLmNvbnRlbnREb2N1bWVudCA6IGlmcm0uY29udGVudFdpbmRvdy5kb2N1bWVudDsgLy9jb250ZW50RG9jdW1lbnQgcmV0dXJucyB0aGUgRG9jdW1lbnQgb2JqZWN0IGdlbmVyYXRlZCBieSBhIA0KICAgICAgICAgICAgICAgdmFyIHNjb3JtRnJhbWUgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoJ1Njb3JtQ29udGVudCcpOw0KDQogICAgICAgICAgICAgICBpZnJtLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICJweCI7DQogICAgICAgICAgICAgICBpZnJtLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgLy8gc2V0IGRpc3BsYXkgcHJvcGVydHkNCiAgICAgICAgICAgICAgIGlmcm0uc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsgLy8gc2V0IHZpc2liaWxpdHkgIA0KICAgICAgICAgICAgICAgLy9pZnJtLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7DQogICAgICAgICAgICAgICAvLyBpZnJtLnN0eWxlLm92ZXJmbG93PSdoaWRkZW4nDQogICAgICAgICAgICAgICAvLyB2YXIgZmYgPSBkb2MuYm9keS5zY3JvbGxXaWR0aDsNCiAgICAgICAgICAgICAgIC8vaWZybS5zdHlsZS53aWR0aCA9IGZmKyJweCI7DQogICAgICAgICAgICAgICBpZiAoc2Nvcm1GcmFtZSkgew0KICAgICAgICAgICAgICAgICAgICBzY29ybUZyYW1lLnN0eWxlLmhlaWdodCA9ICcxMDAlJw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgcHJldkhlaWdodCA9IHNlY2hlaWdodDsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgY250Kys7DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vICQoJyNkZWJ1ZycpLmFwcGVuZCgiY29udGVudCBIZWlnaHQ6OiIgK3NlY2hlaWdodCArIiAgIHByZXYgaGVpZ2h0IitwcmV2SGVpZ2h0ICArICIgd2FpdCBjb3VudDo6IiArIGNudCAgKyI8YnI+Iik7DQogICAgICAgICAgaWYgKGNudCA9PSAzMCkgew0KICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKQ0KICAgICAgICAgIH0NCiAgICAgfSwgMTAwKQ0KfQ0KdmFyIGNoZWNrQm91bmRyaWVzID0gZnVuY3Rpb24oX25hbWUpIHsNCiAgICAgdmFyIGRpYWxvZ0NsYXNzID0gJy4nICsgX25hbWU7DQogICAgICQoIi51aS1kaWFsb2c6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsNCiAgICAgICAgICB2YXIgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQodGhpcykpOw0KICAgICAgICAgIHZhciBwb3MgPSAkKHRoaXMpLmhlaWdodCgpICsgJCh0aGlzKS5wb3NpdGlvbigpLnRvcDsNCg0KICAgICAgICAgIGlmIChwb3MgPiBiLm1heEJvdHRvbUxpbWl0KSB7DQogICAgICAgICAgICAgICB2YXIgZGlmID0gYi5jdXJyZW50Qm90dG9tUG9zIC0gYi5tYXhCb3R0b21MaW1pdDsNCiAgICAgICAgICAgICAgICQoIi5kdW1teSIpLmh0bWwocG9zICsgIiAtLSAiICsgYi5tYXhCb3R0b21MaW1pdCArICIgLS0+ICAiICsgZGlmICsgIiArKysrICAiICsgJCh0aGlzKS5wb3NpdGlvbigpLnRvcCkNCiAgICAgICAgICAgICAgIHZhciB0ZW1wID0gJCh0aGlzKS5wb3NpdGlvbigpLnRvcCAtIGRpZjsNCiAgICAgICAgICAgICAgIGlmICh0ZW1wIDw9IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ3RvcCcsIDApOw0KICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ3RvcCcsIHRlbXApOw0KICAgICAgICAgICAgICAgfQ0KDQoNCg0KICAgICAgICAgIH0NCg0KICAgICB9KTsNCiAgICAgLy92YXIgZGlhbG9nID0gJChkaWFsb2dDbGFzcyk7DQogICAgICQoIi51aS1kaWFsb2c6dmlzaWJsZSIpLmRyYWdnYWJsZSgib3B0aW9uIiwgImNvbnRhaW5tZW50IiwgJyNib3VuZGFyeScpOw0KfQ=="};
|
|
}
|
|
};
|
|
//Запустить перехват
|
|
function on() {
|
|
chrome.webRequest.onBeforeRequest.addListener(
|
|
f,
|
|
{ urls: ["*://www.cambridgelms.org/*"] },
|
|
["blocking"]
|
|
);
|
|
}
|
|
//Завершить перехват
|
|
function off() {
|
|
if( chrome.webRequest.onBeforeRequest.hasListeners() ){
|
|
chrome.webRequest.onBeforeRequest.removeListener(f);
|
|
}
|
|
}
|
|
//Ожидание команд
|
|
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
|
|
if(request.msg==="auto_on") {
|
|
on();
|
|
}
|
|
if(request.msg==="auto_off") {
|
|
off();
|
|
}
|
|
}); |