1 line
88 KiB
Text
1 line
88 KiB
Text
InVzZSBjbGllbnQiOw0KDQppbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCBTdXNwZW5zZSB9IGZyb20gInJlYWN0IjsNCmltcG9ydCB7IHVzZVJvdXRlciwgdXNlU2VhcmNoUGFyYW1zIH0gZnJvbSAibmV4dC9uYXZpZ2F0aW9uIjsNCmltcG9ydCB7IHVzZUVtcHJlc2EgfSBmcm9tICJAL2NvbnRleHRzL0VtcHJlc2FDb250ZXh0IjsNCmltcG9ydCB7IHRyYW5zbGF0ZUVycm9yIH0gZnJvbSAiQC9saWIvZXJyb3ItdHJhbnNsYXRvciI7DQppbXBvcnQgeyBBUElfVjFfQkFTRV9VUkwgfSBmcm9tICJAL2xpYi9hcGlCYXNlIjsNCmltcG9ydCBJbWFnZSBmcm9tICJuZXh0L2ltYWdlIjsNCg0KLyoqDQogKiBDb21wb25lbnRlIGludGVybm8gcXVlIHVzYSB1c2VTZWFyY2hQYXJhbXMNCiAqLw0KY29uc3QgTG9naW5QYWdlQ29udGVudCA9ICgpID0+IHsNCiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKCk7DQogIGNvbnN0IHsgc2V0RW1wcmVzYUlkIH0gPSB1c2VFbXByZXNhKCk7DQogIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHVzZVNlYXJjaFBhcmFtcygpOw0KDQogIC8vIEVzdGFkb3MgZG8gZm9ybXVsw6FyaW8NCiAgY29uc3QgW2VtYWlsLCBzZXRFbWFpbF0gPSB1c2VTdGF0ZTxzdHJpbmc+KCIiKTsgLy8gRW1haWwgZG8gdXN1w6FyaW8NCiAgY29uc3QgW3Bhc3N3b3JkLCBzZXRQYXNzd29yZF0gPSB1c2VTdGF0ZTxzdHJpbmc+KCIiKTsgLy8gU2VuaGEgZG8gdXN1w6FyaW8NCiAgY29uc3QgW25hbWUsIHNldE5hbWVdID0gdXNlU3RhdGU8c3RyaW5nPigiIik7IC8vIE5vbWUgY29tcGxldG8gKGFwZW5hcyBwYXJhIHJlZ2lzdHJvKQ0KICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7IC8vIEVzdGFkbyBkZSBjYXJyZWdhbWVudG8NCiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmc+KCIiKTsgLy8gTWVuc2FnZW5zIGRlIGVycm8NCiAgY29uc3QgW2lzTG9naW4sIHNldElzTG9naW5dID0gdXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSk7IC8vIEFsdGVybmEgZW50cmUgbG9naW4gZSByZWdpc3Rybw0KICBjb25zdCBbY2hlY2tpbmdBdXRoLCBzZXRDaGVja2luZ0F1dGhdID0gdXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSk7IC8vIFZlcmlmaWNhw6fDo28gaW5pY2lhbCBkZSBhdXRlbnRpY2HDp8Ojbw0KICBjb25zdCBbc2hvd1Bhc3N3b3JkLCBzZXRTaG93UGFzc3dvcmRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOyAvLyBDb250cm9sYSB2aXNpYmlsaWRhZGUgZGEgc2VuaGENCiAgY29uc3QgW2FjY2Vzc1Rva2VuLCBzZXRBY2Nlc3NUb2tlbl0gPSB1c2VTdGF0ZTxzdHJpbmc+KCIiKTsgLy8gVG9rZW4gZGUgYWNlc3NvIGRhIEFQSQ0KICBjb25zdCBbc2hvd1N1Y2Nlc3NNb2RhbCwgc2V0U2hvd1N1Y2Nlc3NNb2RhbF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7IC8vIE1vZGFsIGRlIHN1Y2Vzc28gZG8gY2FkYXN0cm8NCiAgY29uc3QgW3Nob3dQZW5kaW5nTW9kYWwsIHNldFNob3dQZW5kaW5nTW9kYWxdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOyAvLyBNb2RhbCBkZSBjYWRhc3RybyBwZW5kZW50ZQ0KDQogIC8qKg0KICAgKiBWZXJpZmljYSBwYXLCom1ldHJvcyBkYSBVUkwgcGFyYSBkZWZpbmlyIGFiYSBpbmljaWFsDQogICAqLw0KICB1c2VFZmZlY3QoKCkgPT4gew0KICAgIGNvbnN0IHRhYiA9IHNlYXJjaFBhcmFtcy5nZXQoJ3RhYicpOw0KICAgIGlmICh0YWIgPT09ICdjYWRhc3RybycpIHsNCiAgICAgIHNldElzTG9naW4oZmFsc2UpOw0KICAgIH0NCiAgfSwgW3NlYXJjaFBhcmFtc10pOw0KDQogIC8qKg0KICAgKiBWZXJpZmljYSBzZSBvIHVzdcOhcmlvIGrDoSBlc3TDoSBhdXRlbnRpY2FkbyBhbyBjYXJyZWdhciBhIHDDoWdpbmENCiAgICogU2UgZXN0aXZlciBhdXRlbnRpY2FkbywgcmVkaXJlY2lvbmEgcGFyYSBvIGRhc2hib2FyZA0KICAgKi8NCiAgdXNlRWZmZWN0KCgpID0+IHsNCiAgICBjb25zdCBjaGVja0F1dGggPSBhc3luYyAoKSA9PiB7DQogICAgICB0cnkgew0KICAgICAgICAvLyBWZXJpZmljYXIgc2UgaMOhIHRva2VuIGFybWF6ZW5hZG8NCiAgICAgICAgY29uc3Qgc3RvcmVkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJyk7DQoNCiAgICAgICAgaWYgKCFzdG9yZWRUb2tlbikgew0KICAgICAgICAgIHNldENoZWNraW5nQXV0aChmYWxzZSk7DQogICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gVmVyaWZpY2FyIGF1dGVudGljYcOnw6NvIHVzYW5kbyBBUEkgY29tIG8gdG9rZW4gbm8gaGVhZGVyIEF1dGhvcml6YXRpb24NCiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgNCiAgICAgICAgICBgJHtBUElfVjFfQkFTRV9VUkx9L2F1dGgvbWVgLA0KICAgICAgICAgIHsNCiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsDQogICAgICAgICAgICBoZWFkZXJzOiB7DQogICAgICAgICAgICAgICJhY2NlcHQiOiAiYXBwbGljYXRpb24vanNvbiIsDQogICAgICAgICAgICAgICJBdXRob3JpemF0aW9uIjogYEJlYXJlciAke3N0b3JlZFRva2VufWAsIC8vIFVzYXIgQXV0aG9yaXphdGlvbiBhbyBpbnbDqXMgZGUgQ29va2llDQogICAgICAgICAgICB9LA0KICAgICAgICAgIH0NCiAgICAgICAgKTsNCg0KDQogICAgICAgIGlmIChyZXNwb25zZS5vaykgew0KICAgICAgICAgIGNvbnN0IHVzZXJEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOw0KICAgICAgICAgIHJvdXRlci5wdXNoKCIvZGFzaGJvYXJkIik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOw0KICAgICAgICAgIC8vIExpbXBhciB0b2tlbiBpbnbDoWxpZG8NCiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYWNjZXNzX3Rva2VuJyk7DQogICAgICAgIH0NCiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICB9IGZpbmFsbHkgew0KICAgICAgICBzZXRDaGVja2luZ0F1dGgoZmFsc2UpOw0KICAgICAgfQ0KICAgIH07DQogICAgY2hlY2tBdXRoKCk7DQogIH0sIFtyb3V0ZXJdKTsNCg0KICAvKioNCiAgICogRnVuw6fDo28gcGFyYSByZWFsaXphciBsb2dpbiBkbyB1c3XDoXJpbyB1c2FuZG8gQVBJDQogICAqIEBwYXJhbSBlbWFpbCAtIEVtYWlsIGRvIHVzdcOhcmlvICh1c2FkbyBjb21vIGlkZW50aWZpY2Fkb3IpDQogICAqIEBwYXJhbSBwYXNzd29yZCAtIFNlbmhhIGRvIHVzdcOhcmlvDQogICAqLw0KICBjb25zdCBsb2dpbiA9IGFzeW5jIChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSA9PiB7DQogICAgc2V0TG9hZGluZyh0cnVlKTsNCiAgICBzZXRFcnJvcigiIik7DQogICAgdHJ5IHsNCg0KICAgICAgLy8gMS4gRmF6ZXIgbG9naW4gbmEgQVBJDQogICAgICBjb25zdCBiYXNlVXJsID0gQVBJX1YxX0JBU0VfVVJMOw0KICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9hdXRoL2xvZ2luYCwgew0KICAgICAgICBtZXRob2Q6ICdQT1NUJywNCiAgICAgICAgaGVhZGVyczogew0KICAgICAgICAgICdhY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsDQogICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywNCiAgICAgICAgfSwNCiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJywgLy8gUGVybWl0ZSBxdWUgbyBicm93c2VyIHJlY2ViYSBlIGFybWF6ZW5lIGNvb2tpZXMNCiAgICAgICAgbW9kZTogJ2NvcnMnLCAvLyBIYWJpbGl0YSBDT1JTIGV4cGxpY2l0YW1lbnRlDQogICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsNCiAgICAgICAgICBpZGVudGlmaWNhZG9yOiBlbWFpbCwNCiAgICAgICAgICBzZW5oYTogcGFzc3dvcmQNCiAgICAgICAgfSkNCiAgICAgIH0pOw0KDQogICAgICAvLyBMZXIgZSBsb2dhciBvIGNvcnBvIGRhIHJlc3Bvc3RhICh1c2FuZG8gY2xvbmUgcGFyYSBuw6NvIGNvbnN1bWlyIG8gYm9keSBvcmlnaW5hbCkNCiAgICAgIGNvbnN0IHJlc3BDbG9uZSA9IHJlc3BvbnNlLmNsb25lKCk7DQogICAgICBjb25zdCByZXNwVGV4dCA9IGF3YWl0IHJlc3BDbG9uZS50ZXh0KCk7DQogICAgICBsZXQgcmVzcEJvZHk6IGFueSA9IHJlc3BUZXh0Ow0KICAgICAgdHJ5IHsNCiAgICAgICAgcmVzcEJvZHkgPSBKU09OLnBhcnNlKHJlc3BUZXh0KTsNCiAgICAgIH0gY2F0Y2ggew0KICAgICAgICAvLyBjb3JwbyBuw6NvIMOpIEpTT04sIG1hbnRlciBjb21vIHRleHRvDQogICAgICB9DQoNCiAgICAgIGlmICghcmVzcG9uc2Uub2spIHsNCiAgICAgICAgLy8gRXh0cmFpciBtZW5zYWdlbSBkZSBlcnJvIGRvIGJhY2tlbmQNCiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IHJlc3BCb2R5Py5tZXNzYWdlIHx8IHJlc3BCb2R5Py5lcnJvciB8fCByZXNwQm9keT8uZGV0YWlsIHx8IHJlc3BUZXh0Ow0KDQogICAgICAgIC8vIFRyYXRhciBjw7NkaWdvcyBkZSBzdGF0dXMgZXNwZWPDrWZpY29zDQogICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkgew0KICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJFbWFpbCBvdSBzZW5oYSBpbmNvcnJldG9zLiBWZXJpZmlxdWUgc3VhcyBjcmVkZW5jaWFpcy4iOw0KICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKSB7DQogICAgICAgICAgZXJyb3JNZXNzYWdlID0gIkFjZXNzbyBuZWdhZG8uIFN1YSBjb250YSBwb2RlIGVzdGFyIGluYXRpdmEuIjsNCiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkgew0KICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJVc3XDoXJpbyBuw6NvIGVuY29udHJhZG8uIFZlcmlmaXF1ZSBvIGVtYWlsIGluZm9ybWFkby4iOw0KICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSA1MDApIHsNCiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiRXJybyBpbnRlcm5vIGRvIHNlcnZpZG9yLiBUZW50ZSBub3ZhbWVudGUgZW0gYWxndW5zIG1pbnV0b3MuIjsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEFwbGljYXIgdHJhZHXDp8OjbyBzZSBkaXNwb27DrXZlbA0KICAgICAgICBjb25zdCB0cmFuc2xhdGVkRXJyb3IgPSB0cmFuc2xhdGVFcnJvcihlcnJvck1lc3NhZ2UpOw0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHJhbnNsYXRlZEVycm9yKTsNCiAgICAgIH0NCg0KICAgICAgY29uc3QgbG9naW5EYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOw0KDQogICAgICAvLyAyLiBDYXB0dXJhciBlIGFybWF6ZW5hciBvIGFjY2Vzc190b2tlbg0KICAgICAgaWYgKGxvZ2luRGF0YS5hY2Nlc3NfdG9rZW4pIHsNCiAgICAgICAgY29uc3QgdG9rZW4gPSBsb2dpbkRhdGEuYWNjZXNzX3Rva2VuOw0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWNjZXNzX3Rva2VuJywgdG9rZW4pOw0KICAgICAgICANCiAgICAgICAgLy8gMy4gVmVyaWZpY2FyIGltZWRpYXRhbWVudGUgc2UgbyAvbWUgZnVuY2lvbmEgY29tIG8gdG9rZW4NCiAgICAgICAgY29uc3QgbWVSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2F1dGgvbWVgLCB7DQogICAgICAgICAgbWV0aG9kOiAiR0VUIiwNCiAgICAgICAgICBoZWFkZXJzOiB7DQogICAgICAgICAgICAiYWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24iLA0KICAgICAgICAgICAgIkF1dGhvcml6YXRpb24iOiBgQmVhcmVyICR7dG9rZW59YCwgLy8gVGVudGFyIGNvbSBBdXRob3JpemF0aW9uIGhlYWRlcg0KICAgICAgICAgIH0sDQogICAgICAgIH0pOw0KDQoNCiAgICAgICAgaWYgKG1lUmVzcG9uc2Uub2spIHsNCiAgICAgICAgICBjb25zdCB1c2VyRGF0YSA9IGF3YWl0IG1lUmVzcG9uc2UuanNvbigpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGNvbnNvbGUubG9nKCLDgsOCwqLCncODw6LigqzCpsODwqLDouKAmsKsw6LigJ7CoiBGYWxoYSBubyAvbWU6IiwgYXdhaXQgbWVSZXNwb25zZS50ZXh0KCkpOw0KICAgICAgICB9DQoNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRocm93IG5ldyBFcnJvcigiVG9rZW4gbsOjbyByZWNlYmlkbyBkbyBzZXJ2aWRvciIpOw0KICAgICAgfQ0KDQogICAgICAvLyA0LiBBcm1hemVuYXIgaW5mb3JtYcOnwrVlcyBkbyB1c3XDoXJpbyBubyBsb2NhbFN0b3JhZ2UNCiAgICAgIGlmIChsb2dpbkRhdGEudXNlcikgew0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlcicsIEpTT04uc3RyaW5naWZ5KGxvZ2luRGF0YS51c2VyKSk7DQoNCiAgICAgICAgLy8gVmVyaWZpY2FyIHNlIG8gcmVnaXN0cm8gZXN0w6EgY29tcGxldG8NCiAgICAgICAgaWYgKGxvZ2luRGF0YS51c2VyWyJyZWdpc3Ryby1jb21wbGV0byJdID09PSBmYWxzZSkgew0KICAgICAgICAgIHNldFNob3dQZW5kaW5nTW9kYWwodHJ1ZSk7DQogICAgICAgICAgcmV0dXJuOyAvLyBOw6NvIGNvbnRpbnVhciBjb20gbyByZWRpcmVjaW9uYW1lbnRvDQogICAgICAgIH0NCg0KICAgICAgICAvLyBBcm1hemVuYXIgSUQgZG8gZW5kZXJlw6dvIHNlIGRpc3BvbsOtdmVsDQogICAgICAgIC8vIEJhY2tlbmQgcG9kZSByZXRvcm5hciAiZW5kZXJlY28iIChzaW5ndWxhcikgb3UgImVuZGVyZWNvcyIgKHBsdXJhbCBhcnJheSkNCiAgICAgICAgbGV0IGVuZGVyZWNvSWQgPSBsb2dpbkRhdGEudXNlci5lbmRlcmVjbzsNCg0KICAgICAgICAvLyBTZSB2aWVyIGNvbW8gYXJyYXksIHBlZ2FyIG8gcHJpbWVpcm8NCiAgICAgICAgaWYgKCFlbmRlcmVjb0lkICYmIGxvZ2luRGF0YS51c2VyLmVuZGVyZWNvcyAmJiBBcnJheS5pc0FycmF5KGxvZ2luRGF0YS51c2VyLmVuZGVyZWNvcykgJiYgbG9naW5EYXRhLnVzZXIuZW5kZXJlY29zLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBlbmRlcmVjb0lkID0gbG9naW5EYXRhLnVzZXIuZW5kZXJlY29zWzBdOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVuZGVyZWNvSWQpIHsNCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlcl9lbmRlcmVjb19pZCcsIGVuZGVyZWNvSWQpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIDUuIFZlcmlmaWNhciBlIGFybWF6ZW5hciBlbXByZXNhIElEIHNlIGRpc3BvbsOtdmVsDQogICAgICBpZiAobG9naW5EYXRhLnVzZXI/LmVtcHJlc2FJZCkgew0KICAgICAgICBzZXRFbXByZXNhSWQobG9naW5EYXRhLnVzZXIuZW1wcmVzYUlkKTsNCiAgICAgIH0NCg0KICAgICAgLy8gNi4gUmVkaXJlY2lvbmFyIHBhcmEgbyBkYXNoYm9hcmQNCiAgICAgIHJvdXRlci5wdXNoKCIvZGFzaGJvYXJkIik7DQoNCiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7DQogICAgICBjb25zb2xlLmVycm9yKCLDgsOCwqLCncODw6LigqzCpsODwqLDouKAmsKsw6LigJ7CoiBFcnJvIG5vIGxvZ2luOiIsIGVycm9yKTsNCg0KICAgICAgLy8gRGVmaW5pciBtZW5zYWdlbSBkZSBlcnJvIGFtaWfDoXZlbA0KICAgICAgbGV0IGZyaWVuZGx5TWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7DQoNCiAgICAgIC8vIFNlIGZvciB1bSBlcnJvIGRlIHJlZGUNCiAgICAgIGlmIChlcnJvci5uYW1lID09PSAnVHlwZUVycm9yJyB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdmZXRjaCcpKSB7DQogICAgICAgIGZyaWVuZGx5TWVzc2FnZSA9ICJFcnJvIGRlIGNvbmV4w6NvLiBWZXJpZmlxdWUgc3VhIGludGVybmV0IGUgdGVudGUgbm92YW1lbnRlLiI7DQogICAgICB9DQogICAgICAvLyBTZSBmb3IgdW0gZXJybyBnZW7DqXJpY28gc2VtIG1lbnNhZ2VtIGNsYXJhDQogICAgICBlbHNlIGlmICghZXJyb3IubWVzc2FnZSB8fCBlcnJvci5tZXNzYWdlLmxlbmd0aCA8IDUpIHsNCiAgICAgICAgZnJpZW5kbHlNZXNzYWdlID0gIkVycm8gaW5lc3BlcmFkby4gVmVyaWZpcXVlIHN1YXMgY3JlZGVuY2lhaXMgZSB0ZW50ZSBub3ZhbWVudGUuIjsNCiAgICAgIH0NCg0KICAgICAgc2V0RXJyb3IoZnJpZW5kbHlNZXNzYWdlKTsNCiAgICB9IGZpbmFsbHkgew0KICAgICAgc2V0TG9hZGluZyhmYWxzZSk7DQogICAgfQ0KICB9Ow0KDQogIC8qKg0KICAgKiBGdW7Dp8OjbyBwYXJhIHJlZ2lzdHJhciBub3ZvIHVzdcOhcmlvIHVzYW5kbyBBUEkNCiAgICogQ3JpYSBjb250YSBlIG1vc3RyYSBtZW5zYWdlbSBkZSBzdWNlc3NvDQogICAqLw0KICBjb25zdCByZWdpc3RlciA9IGFzeW5jICgpID0+IHsNCiAgICBzZXRMb2FkaW5nKHRydWUpOw0KICAgIHNldEVycm9yKCIiKTsNCiAgICB0cnkgew0KDQogICAgICAvLyAxLiBGYXplciByZWdpc3RybyBuYSBBUEkgY29tIGRhZG9zIGNvcnJldG9zDQogICAgICBjb25zdCBiYXNlVXJsID0gQVBJX1YxX0JBU0VfVVJMOw0KICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChiYXNlVXJsICsgJy9hdXRoL3JlZ2lzdGVyJywgew0KICAgICAgICBoZWFkZXJzOiB7DQogICAgICAgICAgJ2FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywNCiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLA0KICAgICAgICB9LA0KICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7DQogICAgICAgICAgaWRlbnRpZmljYWRvcjogZW1haWwsIC8vIGlkZW50aWZpY2Fkb3IgPSBlbWFpbCBkbyB1c3XDoXJpbyAodXNhZG8gbm8gbG9naW4pDQogICAgICAgICAgZW1haWw6IGVtYWlsLA0KICAgICAgICAgIG5vbWU6IG5hbWUsIC8vIG5vbWUgPSBub21lIGNvbXBsZXRvIGRvIHVzdcOhcmlvICANCiAgICAgICAgICBzZW5oYTogcGFzc3dvcmQsDQogICAgICAgICAgbml2ZWw6ICJvd25lciIsIC8vIHZhbG9yIGVzdMOhdGljbw0KICAgICAgICAgICJyZWdpc3Ryby1jb21wbGV0byI6IGZhbHNlIC8vIHZhbG9yIGVzdMOhdGljbyAtIHJlZ2lzdHJvIGluY29tcGxldG8gcG9yIHBhZHLDo28NCiAgICAgICAgfSkNCiAgICAgIH0pOw0KDQoNCiAgICAgIGlmICghcmVzcG9uc2Uub2spIHsNCiAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOw0KDQogICAgICAgIC8vIFRyYXRhciBjw7NkaWdvcyBkZSBzdGF0dXMgZXNwZWPDrWZpY29zDQogICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnJvckRhdGEubWVzc2FnZSB8fCAnRmFsaGEgbm8gcmVnaXN0cm8nOw0KDQogICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwOSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdqw6EgZXhpc3RlJykpIHsNCiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnRXN0ZSBlbWFpbCBqw6EgZXN0w6EgY2FkYXN0cmFkby4gVGVudGUgZmF6ZXIgbG9naW4gb3UgdXNlIG91dHJvIGVtYWlsLic7DQogICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDApIHsNCiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnRGFkb3MgaW52w6FsaWRvcy4gVmVyaWZpcXVlIHNlIHRvZG9zIG9zIGNhbXBvcyBlc3TDo28gcHJlZW5jaGlkb3MgY29ycmV0YW1lbnRlLic7DQogICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDUwMCkgew0KICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdFcnJvIGludGVybm8gZG8gc2Vydmlkb3IuIFRlbnRlIG5vdmFtZW50ZSBlbSBhbGd1bnMgbWludXRvcy4nOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gQXBsaWNhciB0cmFkdcOnw6NvIHNlIGRpc3BvbsOtdmVsDQogICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRFcnJvciA9IHRyYW5zbGF0ZUVycm9yKGVycm9yTWVzc2FnZSk7DQogICAgICAgIHRocm93IG5ldyBFcnJvcih0cmFuc2xhdGVkRXJyb3IpOw0KICAgICAgfQ0KDQogICAgICBjb25zdCByZWdpc3RlckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7DQoNCiAgICAgIC8vIDIuIEZhemVyIGxvZ2luIGF1dG9tw6F0aWNvIGFww7NzIHJlZ2lzdHJvIHBhcmEgb2J0ZXIgdG9rZW4NCiAgICAgIGNvbnN0IGxvZ2luUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9hdXRoL2xvZ2luYCwgew0KICAgICAgICBtZXRob2Q6ICdQT1NUJywNCiAgICAgICAgaGVhZGVyczogew0KICAgICAgICAgICdhY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsDQogICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywNCiAgICAgICAgfSwNCiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJywNCiAgICAgICAgbW9kZTogJ2NvcnMnLA0KICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7DQogICAgICAgICAgaWRlbnRpZmljYWRvcjogZW1haWwsDQogICAgICAgICAgc2VuaGE6IHBhc3N3b3JkDQogICAgICAgIH0pDQogICAgICB9KTsNCg0KICAgICAgaWYgKCFsb2dpblJlc3BvbnNlLm9rKSB7DQogICAgICAgIGNvbnNvbGUuZXJyb3IoIsOCw4LCosKdw4PDouKCrMKmw4PCosOi4oCawqzDouKAnsKiIEVycm8gbm8gbG9naW4gYXV0b23DoXRpY286IiwgbG9naW5SZXNwb25zZS5zdGF0dXMpOw0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm8gYW8gZmF6ZXIgbG9naW4gYXV0b23DoXRpY28gYXDDs3MgcmVnaXN0cm8nKTsNCiAgICAgIH0NCg0KICAgICAgY29uc3QgbG9naW5EYXRhID0gYXdhaXQgbG9naW5SZXNwb25zZS5qc29uKCk7DQoNCiAgICAgIC8vIDMuIEFybWF6ZW5hciB0b2tlbiBlIGRhZG9zIGRvIHVzdcOhcmlvDQogICAgICBpZiAobG9naW5EYXRhLmFjY2Vzc190b2tlbikgew0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWNjZXNzX3Rva2VuJywgbG9naW5EYXRhLmFjY2Vzc190b2tlbik7DQogICAgICB9DQoNCiAgICAgIGlmIChsb2dpbkRhdGEudXNlcikgew0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlcicsIEpTT04uc3RyaW5naWZ5KGxvZ2luRGF0YS51c2VyKSk7DQogICAgICB9DQoNCiAgICAgIC8vIDQuIFJlZGlyZWNpb25hciBwYXJhIGNvbXBsZXRhciByZWdpc3RybyBjb20gdG9rZW4gdsOhbGlkbw0KICAgICAgcm91dGVyLnB1c2goYC9jb21wbGV0YXItcmVnaXN0cm8/bm9tZT0ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX0mZW1haWw9JHtlbmNvZGVVUklDb21wb25lbnQoZW1haWwpfWApOw0KDQogICAgfSBjYXRjaCAoZXJyb3I6IGFueSkgew0KICAgICAgY29uc29sZS5lcnJvcigiw4LDgsKiwp3Dg8Oi4oKswqbDg8Kiw6LigJrCrMOi4oCewqIgRXJybyBubyByZWdpc3RybzoiLCBlcnJvcik7DQoNCiAgICAgIC8vIERlZmluaXIgbWVuc2FnZW0gZGUgZXJybyBhbWlnw6F2ZWwNCiAgICAgIGxldCBmcmllbmRseU1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlOw0KDQogICAgICAvLyBTZSBmb3IgdW0gZXJybyBkZSByZWRlDQogICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1R5cGVFcnJvcicgfHwgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnZmV0Y2gnKSkgew0KICAgICAgICBmcmllbmRseU1lc3NhZ2UgPSAiRXJybyBkZSBjb25leMOjby4gVmVyaWZpcXVlIHN1YSBpbnRlcm5ldCBlIHRlbnRlIG5vdmFtZW50ZS4iOw0KICAgICAgfQ0KICAgICAgLy8gU2UgZm9yIHVtIGVycm8gZ2Vuw6lyaWNvIHNlbSBtZW5zYWdlbSBjbGFyYQ0KICAgICAgZWxzZSBpZiAoIWVycm9yLm1lc3NhZ2UgfHwgZXJyb3IubWVzc2FnZS5sZW5ndGggPCA1KSB7DQogICAgICAgIGZyaWVuZGx5TWVzc2FnZSA9ICJFcnJvIGluZXNwZXJhZG8gZHVyYW50ZSBvIGNhZGFzdHJvLiBUZW50ZSBub3ZhbWVudGUuIjsNCiAgICAgIH0NCg0KICAgICAgc2V0RXJyb3IoZnJpZW5kbHlNZXNzYWdlKTsNCiAgICB9IGZpbmFsbHkgew0KICAgICAgc2V0TG9hZGluZyhmYWxzZSk7DQogICAgfQ0KICB9Ow0KDQogIC8qKg0KICAgKiBGdW7Dp8OjbyBwYXJhIG5vdGlmaWNhciBhZG1pbmlzdHJhZG9yIHNvYnJlIG5vdm8gY2FkYXN0cm8NCiAgICovDQogIGNvbnN0IG5vdGlmeUFkbWluID0gYXN5bmMgKHVzZXJEYXRhOiB7IG5vbWU6IHN0cmluZywgZW1haWw6IHN0cmluZywgaWRlbnRpZmljYWRvcjogc3RyaW5nIH0pID0+IHsNCiAgICB0cnkgew0KICAgICAgLy8gRW52aWFyIG5vdGlmaWNhw6fCtWVzIHZpYSBBUEkgKHVzYW5kbyBSZXNlbmQgcGFyYSBlbWFpbHMgcmVhaXMpDQogICAgICBhd2FpdCBmZXRjaCgnL2FwaS9ub3RpZnktYWRtaW4tcmVzZW5kJywgew0KICAgICAgICBtZXRob2Q6ICdQT1NUJywNCiAgICAgICAgaGVhZGVyczogew0KICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsDQogICAgICAgIH0sDQogICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHVzZXJEYXRhKQ0KICAgICAgfSk7DQogICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm8gYW8gZW52aWFyIG5vdGlmaWNhw6fCtWVzOiIsIGVycm9yKTsNCiAgICAgIC8vIE7Do28gYmxvcXVlYXIgbyBjYWRhc3RybyBwb3IgZXJybyBkZSBub3RpZmljYcOnw6NvDQogICAgfQ0KICB9Ow0KDQogIC8qKg0KICAgKiBGdW7Dp8OjbyBwYXJhIGZlY2hhciBtb2RhbCBkZSBzdWNlc3NvIGUgcmVkaXJlY2lvbmFyDQogICAqLw0KICBjb25zdCBoYW5kbGVTdWNjZXNzTW9kYWxDbG9zZSA9ICgpID0+IHsNCiAgICBzZXRTaG93U3VjY2Vzc01vZGFsKGZhbHNlKTsNCiAgICByb3V0ZXIucHVzaCgnLycpOw0KICB9Ow0KDQogIC8qKg0KICAgKiBGdW7Dp8OjbyBwYXJhIGZlY2hhciBtb2RhbCBkZSBjYWRhc3RybyBwZW5kZW50ZQ0KICAgKi8NCiAgY29uc3QgaGFuZGxlUGVuZGluZ01vZGFsQ2xvc2UgPSAoKSA9PiB7DQogICAgc2V0U2hvd1BlbmRpbmdNb2RhbChmYWxzZSk7DQogICAgLy8gRmF6ZXIgbG9nb3V0IHBhcmEgbGltcGFyIGRhZG9zIGRvIHVzdcOhcmlvDQogICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2FjY2Vzc190b2tlbicpOw0KICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd1c2VyJyk7DQogICAgc2V0QWNjZXNzVG9rZW4oIiIpOw0KICAgIC8vIFJlZGlyZWNpb25hciBwYXJhIHDDoWdpbmEgaW5pY2lhbA0KICAgIHJvdXRlci5wdXNoKCcvJyk7DQogIH07DQoNCiAgLy8gVGVsYSBkZSBjYXJyZWdhbWVudG8gZHVyYW50ZSB2ZXJpZmljYcOnw6NvIGRlIGF1dGVudGljYcOnw6NvDQogIGlmIChjaGVja2luZ0F1dGgpIHsNCiAgICByZXR1cm4gKA0KICAgICAgPGRpdiBjbGFzc05hbWU9Im1pbi1oLXNjcmVlbiBiZy1ncmF5LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIj4NCiAgICAgICAgPGRpdiBjbGFzc05hbWU9InRleHQtY2VudGVyIj4NCiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0idy0xNiBoLTE2IGJvcmRlci00IGJvcmRlci1ibHVlLTYwMCBib3JkZXItdC10cmFuc3BhcmVudCByb3VuZGVkLWZ1bGwgYW5pbWF0ZS1zcGluIG14LWF1dG8gbWItNCI+PC9kaXY+DQogICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LWdyYXktNjAwIj5WZXJpZmljYW5kbyBhdXRlbnRpY2HDp8Ojby4uLjwvcD4NCiAgICAgICAgPC9kaXY+DQogICAgICA8L2Rpdj4NCiAgICApOw0KICB9DQoNCiAgcmV0dXJuICgNCiAgICA8ZGl2IGNsYXNzTmFtZT0ibWluLWgtc2NyZWVuIGJnLWdyYXktNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcC00Ij4NCiAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy13aGl0ZSByb3VuZGVkLTJ4bCBzaGFkb3cteGwgb3ZlcmZsb3ctaGlkZGVuIHctZnVsbCBtYXgtdy1tZCI+DQogICAgICAgIHsvKiBDYWJlw6dhbGhvIGNvbSBsb2dvIGUgc2xvZ2FuICovfQ0KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctZ3JhZGllbnQtdG8tciBmcm9tLWJsdWUtNjAwIHRvLWJsdWUtNzAwIHAtMSB0ZXh0LWNlbnRlciI+DQogICAgICAgICAgPGRpdiBjbGFzc05hbWU9Im14LWF1dG8gLW1iLTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIiPg0KICAgICAgICAgICAgPEltYWdlDQogICAgICAgICAgICAgIHNyYz0iL2xvZ28ucG5nIg0KICAgICAgICAgICAgICBhbHQ9IlNhdmVJbk1lZCBMb2dvIg0KICAgICAgICAgICAgICB3aWR0aD17MTgwfQ0KICAgICAgICAgICAgICBoZWlnaHQ9ezE1MH0NCiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJyb3VuZGVkLWZ1bGwiDQogICAgICAgICAgICAgIHByaW9yaXR5DQogICAgICAgICAgICAvPg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDxoMSBjbGFzc05hbWU9InRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTIiPlNhdmVJbk1lZDwvaDE+DQogICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LWdyYXktMzAwIj5QbGF0YWZvcm1hIEIyQiBkZSBNZWRpY2FtZW50b3M8L3A+DQogICAgICAgIDwvZGl2Pg0KDQogICAgICAgIHsvKiBGb3JtdWzDoXJpbyBkZSBsb2dpbi9yZWdpc3RybyAqL30NCiAgICAgICAgPGRpdiBjbGFzc05hbWU9InAtNiI+DQogICAgICAgICAgey8qIEJvdMK1ZXMgZGUgYWx0ZXJuwqJuY2lhIGVudHJlIExvZ2luIGUgQ2FkYXN0cm8gKi99DQogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggYmctZ3JheS0xMDAgcm91bmRlZC1sZyBwLTEgbWItNiI+DQogICAgICAgICAgICA8YnV0dG9uDQogICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzTG9naW4odHJ1ZSl9DQogICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSBweS0yIHB4LTQgcm91bmRlZC1tZCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tY29sb3JzIGN1cnNvci1wb2ludGVyICR7aXNMb2dpbg0KICAgICAgICAgICAgICAgICAgPyAiYmctd2hpdGUgdGV4dC1ibHVlLTYwMCBzaGFkb3ctc20iDQogICAgICAgICAgICAgICAgICA6ICJ0ZXh0LWdyYXktNjAwIGhvdmVyOnRleHQtZ3JheS04MDAiDQogICAgICAgICAgICAgICAgfWB9DQogICAgICAgICAgICA+DQogICAgICAgICAgICAgIEVudHJhcg0KICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8YnV0dG9uDQogICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzTG9naW4oZmFsc2UpfQ0KICAgICAgICAgICAgICBjbGFzc05hbWU9e2BmbGV4LTEgcHktMiBweC00IHJvdW5kZWQtbWQgdGV4dC1zbSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWNvbG9ycyBjdXJzb3ItcG9pbnRlciAkeyFpc0xvZ2luDQogICAgICAgICAgICAgICAgICA/ICJiZy13aGl0ZSB0ZXh0LWJsdWUtNjAwIHNoYWRvdy1zbSINCiAgICAgICAgICAgICAgICAgIDogInRleHQtZ3JheS02MDAgaG92ZXI6dGV4dC1ncmF5LTgwMCINCiAgICAgICAgICAgICAgICB9YH0NCiAgICAgICAgICAgID4NCiAgICAgICAgICAgICAgQ2FkYXN0cmFyDQogICAgICAgICAgICA8L2J1dHRvbj4NCiAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgIHsvKiBNZW5zYWdlbSBkZSBlcnJvICovfQ0KICAgICAgICAgIHtlcnJvciAmJiAoDQogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctcmVkLTUwIGJvcmRlciBib3JkZXItcmVkLTIwMCByb3VuZGVkLWxnIHAtMyBtYi00Ij4NCiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIj4NCiAgICAgICAgICAgICAgICA8c3ZnDQogICAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctNSBoLTUgdGV4dC1yZWQtNTAwIG1yLTIiDQogICAgICAgICAgICAgICAgICBmaWxsPSJjdXJyZW50Q29sb3IiDQogICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjAgMjAiDQogICAgICAgICAgICAgICAgPg0KICAgICAgICAgICAgICAgICAgPHBhdGgNCiAgICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9ImV2ZW5vZGQiDQogICAgICAgICAgICAgICAgICAgIGQ9Ik0xOCAxMGE4IDggMCAxMS0xNiAwIDggOCAwIDAxMTYgMHptLTcgNGExIDEgMCAxMS0yIDAgMSAxIDAgMDEyIDB6bS0xLTlhMSAxIDAgMDAtMSAxdjRhMSAxIDAgMTAyIDBWNmExIDEgMCAwMC0xLTF6Ig0KICAgICAgICAgICAgICAgICAgICBjbGlwUnVsZT0iZXZlbm9kZCINCiAgICAgICAgICAgICAgICAgIC8+DQogICAgICAgICAgICAgICAgPC9zdmc+DQogICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtcmVkLTcwMCI+e2Vycm9yfTwvcD4NCiAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICApfQ0KDQogICAgICAgICAgPGZvcm0gY2xhc3NOYW1lPSJzcGFjZS15LTQiPg0KICAgICAgICAgICAgey8qIENhbXBvIE5vbWUgKGFwZW5hcyBwYXJhIHJlZ2lzdHJvKSAqL30NCiAgICAgICAgICAgIHshaXNMb2dpbiAmJiAoDQogICAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0iYmxvY2sgdy1mdWxsIHRleHQtY2VudGVyIHRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LWJsdWUtNjAwIG1iLTMiPg0KICAgICAgICAgICAgICAgICAgQ2FkYXN0cmUgc3VhIEVtcHJlc2EhDQogICAgICAgICAgICAgICAgPC9sYWJlbD4NCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMiI+DQogICAgICAgICAgICAgICAgICBOb21lIENvbXBsZXRvDQogICAgICAgICAgICAgICAgPC9sYWJlbD4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0icmVsYXRpdmUiPg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlciBwb2ludGVyLWV2ZW50cy1ub25lIj4NCiAgICAgICAgICAgICAgICAgICAgPHN2Zw0KICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0iaC01IHctNSB0ZXh0LWdyYXktNDAwIg0KICAgICAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiDQogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPSJjdXJyZW50Q29sb3IiDQogICAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDI0IDI0Ig0KICAgICAgICAgICAgICAgICAgICA+DQogICAgICAgICAgICAgICAgICAgICAgPHBhdGgNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezJ9DQogICAgICAgICAgICAgICAgICAgICAgICBkPSJNMTYgN2E0IDQgMCAxMS04IDAgNCA0IDAgMDE4IDB6TTEyIDE0YTcgNyAwIDAwLTcgN2gxNGE3IDcgMCAwMC03LTd6Ig0KICAgICAgICAgICAgICAgICAgICAgIC8+DQogICAgICAgICAgICAgICAgICAgIDwvc3ZnPg0KICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICA8aW5wdXQNCiAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCINCiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9Ikpvw6NvIFNpbHZhIg0KICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bmFtZX0NCiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXROYW1lKGUudGFyZ2V0LnZhbHVlKX0NCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcGwtMTAgcHItNCBweS0zIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1sZyBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1ncmF5LTkwMCBwbGFjZWhvbGRlci1ncmF5LTUwMCINCiAgICAgICAgICAgICAgICAgIC8+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgKX0NCg0KICAgICAgICAgICAgey8qIENhbXBvIEVtYWlsICovfQ0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0iYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIG1iLTIiPg0KICAgICAgICAgICAgICAgIEVtYWlsDQogICAgICAgICAgICAgIDwvbGFiZWw+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJyZWxhdGl2ZSI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlciBwb2ludGVyLWV2ZW50cy1ub25lIj4NCiAgICAgICAgICAgICAgICAgIDxzdmcNCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJoLTUgdy01IHRleHQtZ3JheS00MDAiDQogICAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiDQogICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iY3VycmVudENvbG9yIg0KICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiDQogICAgICAgICAgICAgICAgICA+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoDQogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWNhcD0icm91bmQiDQogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPXsyfQ0KICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0xNiAxMmE0IDQgMCAxMC04IDAgNCA0IDAgMDA4IDB6bTAgMHYxLjVhMi41IDIuNSAwIDAwNSAwVjEyYTkgOSAwIDEwLTkgOW00LjUtMS4yMDZhOC45NTkgOC45NTkgMCAwMS00LjUgMS4yMDciDQogICAgICAgICAgICAgICAgICAgIC8+DQogICAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8aW5wdXQNCiAgICAgICAgICAgICAgICAgIHR5cGU9ImVtYWlsIg0KICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9InNldUBlbWFpbC5jb20iDQogICAgICAgICAgICAgICAgICB2YWx1ZT17ZW1haWx9DQogICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEVtYWlsKGUudGFyZ2V0LnZhbHVlKX0NCiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHBsLTEwIHByLTQgcHktMyBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbGcgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIHRleHQtZ3JheS05MDAgcGxhY2Vob2xkZXItZ3JheS01MDAiDQogICAgICAgICAgICAgICAgLz4NCiAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgey8qIENhbXBvIFNlbmhhICovfQ0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0iYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIG1iLTIiPg0KICAgICAgICAgICAgICAgIFNlbmhhDQogICAgICAgICAgICAgIDwvbGFiZWw+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJyZWxhdGl2ZSI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlciBwb2ludGVyLWV2ZW50cy1ub25lIj4NCiAgICAgICAgICAgICAgICAgIDxzdmcNCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJoLTUgdy01IHRleHQtZ3JheS00MDAiDQogICAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiDQogICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iY3VycmVudENvbG9yIg0KICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiDQogICAgICAgICAgICAgICAgICA+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoDQogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWNhcD0icm91bmQiDQogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPXsyfQ0KICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0xMiAxNXYybS02IDRoMTJhMiAyIDAgMDAyLTJ2LTZhMiAyIDAgMDAtMi0ySDZhMiAyIDAgMDAtMiAydjZhMiAyIDAgMDAyIDJ6bTEwLTEwVjdhNCA0IDAgMDAtOCAwdjRoOHoiDQogICAgICAgICAgICAgICAgICAgIC8+DQogICAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8aW5wdXQNCiAgICAgICAgICAgICAgICAgIHR5cGU9e3Nob3dQYXNzd29yZCA/ICJ0ZXh0IiA6ICJwYXNzd29yZCJ9DQogICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iw4LDgsKiw4PDgsKiw4PCosOi4oCawqzDhcKhw4LDgsKswqLDgsOCwqLDg8OCwqLDg8Kiw6LigJrCrMOFwqHDgsOCwqzCosOCw4LCosODw4LCosODwqLDouKAmsKsw4XCocOCw4LCrMKiw4LDgsKiw4PDgsKiw4PCosOi4oCawqzDhcKhw4LDgsKswqLDgsOCwqLDg8OCwqLDg8Kiw6LigJrCrMOFwqHDgsOCwqzCosOCw4LCosODw4LCosODwqLDouKAmsKsw4XCocOCw4LCrMKiw4LDgsKiw4PDgsKiw4PCosOi4oCawqzDhcKhw4LDgsKswqLDgsOCwqLDg8OCwqLDg8Kiw6LigJrCrMOFwqHDgsOCwqzCoiINCiAgICAgICAgICAgICAgICAgIHZhbHVlPXtwYXNzd29yZH0NCiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0UGFzc3dvcmQoZS50YXJnZXQudmFsdWUpfQ0KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcGwtMTAgcHItMTIgcHktMyBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbGcgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIHRleHQtZ3JheS05MDAgcGxhY2Vob2xkZXItZ3JheS01MDAiDQogICAgICAgICAgICAgICAgLz4NCiAgICAgICAgICAgICAgICA8YnV0dG9uDQogICAgICAgICAgICAgICAgICB0eXBlPSJidXR0b24iDQogICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93UGFzc3dvcmQoIXNob3dQYXNzd29yZCl9DQogICAgICAgICAgICAgICAgICBjbGFzc05hbWU9ImFic29sdXRlIGluc2V0LXktMCByaWdodC0wIHByLTMgZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXIgaG92ZXI6dGV4dC1ncmF5LTYwMCB0cmFuc2l0aW9uLWNvbG9ycyINCiAgICAgICAgICAgICAgICA+DQogICAgICAgICAgICAgICAgICB7c2hvd1Bhc3N3b3JkID8gKA0KICAgICAgICAgICAgICAgICAgICA8c3ZnDQogICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJoLTUgdy01IHRleHQtZ3JheS00MDAiDQogICAgICAgICAgICAgICAgICAgICAgZmlsbD0ibm9uZSINCiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9ImN1cnJlbnRDb2xvciINCiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiDQogICAgICAgICAgICAgICAgICAgID4NCiAgICAgICAgICAgICAgICAgICAgICA8cGF0aA0KICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWNhcD0icm91bmQiDQogICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VMaW5lam9pbj0icm91bmQiDQogICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD17Mn0NCiAgICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0xMy44NzUgMTguODI1QTEwLjA1IDEwLjA1IDAgMDExMiAxOWMtNC40NzggMC04LjI2OC0yLjk0My05LjU0My03YTkuOTcgOS45NyAwIDAxMS41NjMtMy4wMjltNS44NTguOTA4YTMgMyAwIDExNC4yNDMgNC4yNDNNOS44NzggOS44NzhsNC4yNDIgNC4yNDJNOS44NzggOS44NzhMMyAzbTYuODc4IDYuODc4TDIxIDIxIg0KICAgICAgICAgICAgICAgICAgICAgIC8+DQogICAgICAgICAgICAgICAgICAgIDwvc3ZnPg0KICAgICAgICAgICAgICAgICAgKSA6ICgNCiAgICAgICAgICAgICAgICAgICAgPHN2Zw0KICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0iaC01IHctNSB0ZXh0LWdyYXktNDAwIg0KICAgICAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiDQogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPSJjdXJyZW50Q29sb3IiDQogICAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDI0IDI0Ig0KICAgICAgICAgICAgICAgICAgICA+DQogICAgICAgICAgICAgICAgICAgICAgPHBhdGgNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezJ9DQogICAgICAgICAgICAgICAgICAgICAgICBkPSJNMTUgMTJhMyAzIDAgMTEtNiAwIDMgMyAwIDAxNiAweiINCiAgICAgICAgICAgICAgICAgICAgICAvPg0KICAgICAgICAgICAgICAgICAgICAgIDxwYXRoDQogICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPSJyb3VuZCINCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVqb2luPSJyb3VuZCINCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPXsyfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZD0iTTIuNDU4IDEyQzMuNzMyIDcuOTQzIDcuNTIzIDUgMTIgNWM0LjQ3OCAwIDguMjY4IDIuOTQzIDkuNTQyIDctMS4yNzQgNC4wNTctNS4wNjQgNy05LjU0MiA3LTQuNDc3IDAtOC4yNjgtMi45NDMtOS41NDItN3oiDQogICAgICAgICAgICAgICAgICAgICAgLz4NCiAgICAgICAgICAgICAgICAgICAgPC9zdmc+DQogICAgICAgICAgICAgICAgICApfQ0KICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICB7LyogQm90wrVlcyBkZSBTdWJtaXQgKi99DQogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ic3BhY2UteS0zIHB0LTIiPg0KICAgICAgICAgICAgICB7aXNMb2dpbiA/ICgNCiAgICAgICAgICAgICAgICA8YnV0dG9uDQogICAgICAgICAgICAgICAgICB0eXBlPSJidXR0b24iDQogICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBsb2dpbihlbWFpbCwgcGFzc3dvcmQpfQ0KICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmcgfHwgIWVtYWlsIHx8ICFwYXNzd29yZH0NCiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIGJnLWdyYWRpZW50LXRvLXIgZnJvbS1ibHVlLTYwMCB0by1ibHVlLTcwMCBob3Zlcjpmcm9tLWJsdWUtNzAwIGhvdmVyOnRvLWJsdWUtODAwIGRpc2FibGVkOmZyb20tZ3JheS00MDAgZGlzYWJsZWQ6dG8tZ3JheS01MDAgdGV4dC13aGl0ZSBmb250LXNlbWlib2xkIHB5LTMgcHgtNiByb3VuZGVkLWxnIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzcGFjZS14LTIgY3Vyc29yLXBvaW50ZXIgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIg0KICAgICAgICAgICAgICAgID4NCiAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKA0KICAgICAgICAgICAgICAgICAgICA8Pg0KICAgICAgICAgICAgICAgICAgICAgIDxzdmcNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0iYW5pbWF0ZS1zcGluIGgtNSB3LTUgdGV4dC13aGl0ZSINCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiDQogICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiDQogICAgICAgICAgICAgICAgICAgICAgPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9wYWNpdHktMjUiDQogICAgICAgICAgICAgICAgICAgICAgICAgIGN4PSIxMiINCiAgICAgICAgICAgICAgICAgICAgICAgICAgY3k9IjEyIg0KICAgICAgICAgICAgICAgICAgICAgICAgICByPSIxMCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPSJjdXJyZW50Q29sb3IiDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPSI0Ig0KICAgICAgICAgICAgICAgICAgICAgICAgPjwvY2lyY2xlPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcGFjaXR5LTc1Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSJjdXJyZW50Q29sb3IiDQogICAgICAgICAgICAgICAgICAgICAgICAgIGQ9Ik00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3eiINCiAgICAgICAgICAgICAgICAgICAgICAgID48L3BhdGg+DQogICAgICAgICAgICAgICAgICAgICAgPC9zdmc+DQogICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RW50cmFuZG8uLi48L3NwYW4+DQogICAgICAgICAgICAgICAgICAgIDwvPg0KICAgICAgICAgICAgICAgICAgKSA6ICgNCiAgICAgICAgICAgICAgICAgICAgPD4NCiAgICAgICAgICAgICAgICAgICAgICA8c3ZnDQogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctNSBoLTUiDQogICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSJub25lIg0KICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPSJjdXJyZW50Q29sb3IiDQogICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiDQogICAgICAgICAgICAgICAgICAgICAgPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWNhcD0icm91bmQiDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVqb2luPSJyb3VuZCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezJ9DQogICAgICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0xMSAxNmwtNC00bTAgMGw0LTRtLTQgNGgxNG0tNSA0djFhMyAzIDAgMDEtMyAzSDZhMyAzIDAgMDEtMy0zVjdhMyAzIDAgMDEzLTNoN2EzIDMgMCAwMTMgM3YxIg0KICAgICAgICAgICAgICAgICAgICAgICAgLz4NCiAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5FbnRyYXI8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgIDwvPg0KICAgICAgICAgICAgICAgICAgKX0NCiAgICAgICAgICAgICAgICA8L2J1dHRvbj4NCiAgICAgICAgICAgICAgKSA6ICgNCiAgICAgICAgICAgICAgICA8YnV0dG9uDQogICAgICAgICAgICAgICAgICB0eXBlPSJidXR0b24iDQogICAgICAgICAgICAgICAgICBvbkNsaWNrPXtyZWdpc3Rlcn0NCiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nIHx8ICFlbWFpbCB8fCAhcGFzc3dvcmQgfHwgIW5hbWV9DQogICAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCBiZy1ncmFkaWVudC10by1yIGZyb20tZ3JlZW4tNjAwIHRvLWdyZWVuLTcwMCBob3Zlcjpmcm9tLWdyZWVuLTcwMCBob3Zlcjp0by1ncmVlbi04MDAgZGlzYWJsZWQ6ZnJvbS1ncmF5LTQwMCBkaXNhYmxlZDp0by1ncmF5LTUwMCB0ZXh0LXdoaXRlIGZvbnQtc2VtaWJvbGQgcHktMyBweC02IHJvdW5kZWQtbGcgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHNwYWNlLXgtMiBjdXJzb3ItcG9pbnRlciBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQiDQogICAgICAgICAgICAgICAgPg0KICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoDQogICAgICAgICAgICAgICAgICAgIDw+DQogICAgICAgICAgICAgICAgICAgICAgPHN2Zw0KICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJhbmltYXRlLXNwaW4gaC01IHctNSB0ZXh0LXdoaXRlIg0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0ibm9uZSINCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCINCiAgICAgICAgICAgICAgICAgICAgICA+DQogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3BhY2l0eS0yNSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgY3g9IjEyIg0KICAgICAgICAgICAgICAgICAgICAgICAgICBjeT0iMTIiDQogICAgICAgICAgICAgICAgICAgICAgICAgIHI9IjEwIg0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9ImN1cnJlbnRDb2xvciINCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9IjQiDQogICAgICAgICAgICAgICAgICAgICAgICA+PC9jaXJjbGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9wYWNpdHktNzUiDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9ImN1cnJlbnRDb2xvciINCiAgICAgICAgICAgICAgICAgICAgICAgICAgZD0iTTQgMTJhOCA4IDAgMDE4LThWMEM1LjM3MyAwIDAgNS4zNzMgMCAxMmg0em0yIDUuMjkxQTcuOTYyIDcuOTYyIDAgMDE0IDEySDBjMCAzLjA0MiAxLjEzNSA1LjgyNCAzIDcuOTM4bDMtMi42NDd6Ig0KICAgICAgICAgICAgICAgICAgICAgICAgPjwvcGF0aD4NCiAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DcmlhbmRvIGNvbnRhLi4uPC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICA8Lz4NCiAgICAgICAgICAgICAgICAgICkgOiAoDQogICAgICAgICAgICAgICAgICAgIDw+DQogICAgICAgICAgICAgICAgICAgICAgPHN2Zw0KICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LTUgaC01Ig0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0ibm9uZSINCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iY3VycmVudENvbG9yIg0KICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDI0IDI0Ig0KICAgICAgICAgICAgICAgICAgICAgID4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VMaW5lam9pbj0icm91bmQiDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPXsyfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBkPSJNMTggOXYzbTAgMHYzbTAtM2gzbS0zIDBoLTNtLTItNWE0IDQgMCAxMS04IDAgNCA0IDAgMDE4IDB6TTMgMjBhNiA2IDAgMDExMiAwdjFIM3YtMXoiDQogICAgICAgICAgICAgICAgICAgICAgICAvPg0KICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPg0KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkNyaWFyIENvbnRhPC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICA8Lz4NCiAgICAgICAgICAgICAgICAgICl9DQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICAgICl9DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8L2Zvcm0+DQogICAgICAgIDwvZGl2Pg0KICAgICAgPC9kaXY+DQoNCiAgICAgIHsvKiBNb2RhbCBkZSBTdWNlc3NvIGRvIENhZGFzdHJvICovfQ0KICAgICAge3Nob3dTdWNjZXNzTW9kYWwgJiYgKA0KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZml4ZWQgaW5zZXQtMCBiZy13aGl0ZSBiZy1vcGFjaXR5LTk1IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtNCB6LTUwIj4NCiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LTJ4bCBtYXgtdy1tZCB3LWZ1bGwgbXgtNCBhbmltYXRlLWluIGZhZGUtaW4gc2xpZGUtaW4tZnJvbS1ib3R0b20tNCBkdXJhdGlvbi0zMDAiPg0KICAgICAgICAgICAgey8qIEhlYWRlciBkbyBNb2RhbCAqL30NCiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy1ncmFkaWVudC10by1yIGZyb20tZ3JlZW4tNTAwIHRvLWdyZWVuLTYwMCBwLTYgcm91bmRlZC10LTJ4bCB0ZXh0LWNlbnRlciI+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJ3LTE2IGgtMTYgYmctd2hpdGUgYmctb3BhY2l0eS0yMCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbXgtYXV0byBtYi00Ij4NCiAgICAgICAgICAgICAgICA8c3ZnDQogICAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctOCBoLTggdGV4dC13aGl0ZSINCiAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiDQogICAgICAgICAgICAgICAgICBzdHJva2U9ImN1cnJlbnRDb2xvciINCiAgICAgICAgICAgICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCINCiAgICAgICAgICAgICAgICA+DQogICAgICAgICAgICAgICAgICA8cGF0aA0KICAgICAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPSJyb3VuZCINCiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD17Mn0NCiAgICAgICAgICAgICAgICAgICAgZD0iTTUgMTNsNCA0TDE5IDciDQogICAgICAgICAgICAgICAgICAvPg0KICAgICAgICAgICAgICAgIDwvc3ZnPg0KICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT0idGV4dC0yeGwgZm9udC1ib2xkIHRleHQtd2hpdGUiPg0KICAgICAgICAgICAgICAgIENhZGFzdHJvIEVudmlhZG8hDQogICAgICAgICAgICAgIDwvaDI+DQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgey8qIENvbnRlw7pkbyBkbyBNb2RhbCAqL30NCiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJwLTYgdGV4dC1jZW50ZXIiPg0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibWItNiI+DQogICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LWdyYXktNzAwIHRleHQtbGcgbGVhZGluZy1yZWxheGVkIj4NCiAgICAgICAgICAgICAgICAgIFNldSBjYWRhc3RybyBmb2kgZW52aWFkbyBjb20gPHN0cm9uZz5zdWNlc3NvPC9zdHJvbmc+IQ0KICAgICAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtZ3JheS02MDAgbXQtMyI+DQogICAgICAgICAgICAgICAgICBOb3NzYSBlcXVpcGUgZW50cmFyw6EgZW0gY29udGF0byBlbSBicmV2ZSBwYXJhIGZpbmFsaXphciBzZXUgYWNlc3NvIMKgIHBsYXRhZm9ybWEuDQogICAgICAgICAgICAgICAgPC9wPg0KICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICB7Lyogwo1jb25lIGRlY29yYXRpdm8gKi99DQogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGp1c3RpZnktY2VudGVyIG1iLTYiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IHNwYWNlLXgtMiI+DQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0idy0zIGgtMyBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIGFuaW1hdGUtcHVsc2UiPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9InctMyBoLTMgYmctZ3JlZW4tNDAwIHJvdW5kZWQtZnVsbCBhbmltYXRlLXB1bHNlIGRlbGF5LTEwMCI+PC9kaXY+DQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0idy0zIGgtMyBiZy1ncmVlbi0zMDAgcm91bmRlZC1mdWxsIGFuaW1hdGUtcHVsc2UgZGVsYXktMjAwIj48L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgey8qIEJvdMOjbyBkZSBPSyAqL30NCiAgICAgICAgICAgICAgPGJ1dHRvbg0KICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVN1Y2Nlc3NNb2RhbENsb3NlfQ0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIGJnLWdyYWRpZW50LXRvLXIgZnJvbS1ncmVlbi01MDAgdG8tZ3JlZW4tNjAwIGhvdmVyOmZyb20tZ3JlZW4tNjAwIGhvdmVyOnRvLWdyZWVuLTcwMCB0ZXh0LXdoaXRlIGZvbnQtc2VtaWJvbGQgcHktNCBweC02IHJvdW5kZWQteGwgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIHRyYW5zZm9ybSBob3ZlcjpzY2FsZS0xMDUgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctNCBmb2N1czpyaW5nLWdyZWVuLTIwMCINCiAgICAgICAgICAgICAgPg0KICAgICAgICAgICAgICAgIEVudGVuZGksIG9icmlnYWRvIQ0KICAgICAgICAgICAgICA8L2J1dHRvbj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgICl9DQoNCiAgICAgIHsvKiBNb2RhbCBkZSBDYWRhc3RybyBQZW5kZW50ZSAqL30NCiAgICAgIHtzaG93UGVuZGluZ01vZGFsICYmICgNCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZpeGVkIGluc2V0LTAgYmctd2hpdGUgYmctb3BhY2l0eS05NSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBwLTQgei01MCI+DQogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImJnLXdoaXRlIHJvdW5kZWQtMnhsIHNoYWRvdy0yeGwgbWF4LXctbWQgdy1mdWxsIG14LTQgYW5pbWF0ZS1pbiBmYWRlLWluIHNsaWRlLWluLWZyb20tYm90dG9tLTQgZHVyYXRpb24tMzAwIj4NCiAgICAgICAgICAgIHsvKiBIZWFkZXIgZG8gTW9kYWwgKi99DQogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctZ3JhZGllbnQtdG8tciBmcm9tLXllbGxvdy01MDAgdG8tb3JhbmdlLTUwMCBwLTYgcm91bmRlZC10LTJ4bCB0ZXh0LWNlbnRlciI+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJ3LTE2IGgtMTYgYmctd2hpdGUgYmctb3BhY2l0eS0yMCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbXgtYXV0byBtYi00Ij4NCiAgICAgICAgICAgICAgICA8c3ZnDQogICAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctOCBoLTggdGV4dC13aGl0ZSINCiAgICAgICAgICAgICAgICAgIGZpbGw9Im5vbmUiDQogICAgICAgICAgICAgICAgICBzdHJva2U9ImN1cnJlbnRDb2xvciINCiAgICAgICAgICAgICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCINCiAgICAgICAgICAgICAgICA+DQogICAgICAgICAgICAgICAgICA8cGF0aA0KICAgICAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPSJyb3VuZCINCiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49InJvdW5kIg0KICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD17Mn0NCiAgICAgICAgICAgICAgICAgICAgZD0iTTEyIDl2Mm0wIDRoLjAxbS02LjkzOCA0aDEzLjg1NmMxLjU0IDAgMi41MDItMS42NjcgMS43MzItMi41TDEzLjczMiA0Yy0uNzctLjgzMy0xLjk2NC0uODMzLTIuNzMyIDBMMy43MzIgMTYuNWMtLjc3LjgzMy4xOTIgMi41IDEuNzMyIDIuNXoiDQogICAgICAgICAgICAgICAgICAvPg0KICAgICAgICAgICAgICAgIDwvc3ZnPg0KICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT0idGV4dC0yeGwgZm9udC1ib2xkIHRleHQtd2hpdGUiPg0KICAgICAgICAgICAgICAgIENhZGFzdHJvIFBlbmRlbnRlDQogICAgICAgICAgICAgIDwvaDI+DQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgey8qIENvbnRlw7pkbyBkbyBNb2RhbCAqL30NCiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJwLTYgdGV4dC1jZW50ZXIiPg0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibWItNiI+DQogICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LWdyYXktNzAwIHRleHQtbGcgbGVhZGluZy1yZWxheGVkIj4NCiAgICAgICAgICAgICAgICAgIFNldSBjYWRhc3RybyBlc3TDoSA8c3Ryb25nPnBlbmRlbnRlIGRlIHZhbGlkYcOnw6NvPC9zdHJvbmc+IQ0KICAgICAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtZ3JheS02MDAgbXQtMyI+DQogICAgICAgICAgICAgICAgICBOb3NzYSBlcXVpcGUgYWluZGEgZXN0w6EgYW5hbGlzYW5kbyBzdWFzIGluZm9ybWHDp8K1ZXMuIFZvY8OqIHJlY2ViZXLDoSB1bWEgY29uZmlybWHDp8OjbyBlbSBicmV2ZS4NCiAgICAgICAgICAgICAgICA8L3A+DQogICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LWdyYXktNjAwIG10LTMiPg0KICAgICAgICAgICAgICAgICAgUXVhbHF1ZXIgZMO6dmlkYSwgZW50cmUgZW0gY29udGF0byBjb25vc2NvLg0KICAgICAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgey8qIMKNY29uZSBkZWNvcmF0aXZvICovfQ0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBqdXN0aWZ5LWNlbnRlciBtYi02Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBzcGFjZS14LTIiPg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9InctMyBoLTMgYmcteWVsbG93LTUwMCByb3VuZGVkLWZ1bGwgYW5pbWF0ZS1wdWxzZSI+PC9kaXY+DQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0idy0zIGgtMyBiZy1vcmFuZ2UtNDAwIHJvdW5kZWQtZnVsbCBhbmltYXRlLXB1bHNlIGRlbGF5LTEwMCI+PC9kaXY+DQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0idy0zIGgtMyBiZy15ZWxsb3ctMzAwIHJvdW5kZWQtZnVsbCBhbmltYXRlLXB1bHNlIGRlbGF5LTIwMCI+PC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgIHsvKiBCb3TDo28gZGUgT0sgKi99DQogICAgICAgICAgICAgIDxidXR0b24NCiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQZW5kaW5nTW9kYWxDbG9zZX0NCiAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCBiZy1ncmFkaWVudC10by1yIGZyb20teWVsbG93LTUwMCB0by1vcmFuZ2UtNTAwIGhvdmVyOmZyb20teWVsbG93LTYwMCBob3Zlcjp0by1vcmFuZ2UtNjAwIHRleHQtd2hpdGUgZm9udC1zZW1pYm9sZCBweS00IHB4LTYgcm91bmRlZC14bCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgdHJhbnNmb3JtIGhvdmVyOnNjYWxlLTEwNSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy00IGZvY3VzOnJpbmcteWVsbG93LTIwMCINCiAgICAgICAgICAgICAgPg0KICAgICAgICAgICAgICAgIEVudGVuZGkNCiAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICApfQ0KICAgIDwvZGl2Pg0KICApOw0KfTsNCg0KLyoqDQogKiBDb21wb25lbnRlIHdyYXBwZXIgcXVlIHVzYSBTdXNwZW5zZSBwYXJhIHJlc29sdmVyIG8gZXJybyBkZSB1c2VTZWFyY2hQYXJhbXMNCiAqLw0KY29uc3QgTG9naW5QYWdlID0gKCkgPT4gew0KICByZXR1cm4gKA0KICAgIDxTdXNwZW5zZSBmYWxsYmFjaz17DQogICAgICA8ZGl2IGNsYXNzTmFtZT0ibWluLWgtc2NyZWVuIGJnLWdyYWRpZW50LXRvLWJyIGZyb20tYmx1ZS01MCB0by1ncmVlbi01MCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciI+DQogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJ0ZXh0LWNlbnRlciI+DQogICAgICAgICAgPGRpdiBjbGFzc05hbWU9InctMTYgaC0xNiBib3JkZXItNCBib3JkZXItYmx1ZS02MDAgYm9yZGVyLXQtdHJhbnNwYXJlbnQgcm91bmRlZC1mdWxsIGFuaW1hdGUtc3BpbiBteC1hdXRvIG1iLTQiPjwvZGl2Pg0KICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1ncmF5LTYwMCI+Q2FycmVnYW5kby4uLjwvcD4NCiAgICAgICAgPC9kaXY+DQogICAgICA8L2Rpdj4NCiAgICB9Pg0KICAgICAgPExvZ2luUGFnZUNvbnRlbnQgLz4NCiAgICA8L1N1c3BlbnNlPg0KICApOw0KfTsNCg0KZXhwb3J0IGRlZmF1bHQgTG9naW5QYWdlOw0K
|