PCEtLQ0KICAgIA0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCiAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAgICANCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCiAgICANCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoNCi0tPg0KPCEtLSAkUmV2OiA1OTMwMDQgJCAkRGF0ZTogMjAwNy0xMS0wOCAwNDowNDo1NCArMDAwMCAoVGh1LCAwOCBOb3YgMjAwNykgJCAtLT4NCjxodG1sPg0KPGhlYWQ+DQo8dGl0bGU+U2VydmljZU1peCBXU0RMLUZpcnN0IEV4YW1wbGU8L3RpdGxlPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KdmFyIHVybFRvT3BlbiA9ICJodHRwOi8vbG9jYWxob3N0OjgwOTIvUGVyc29uU2VydmljZS8iOyAvL2RlZmF1bHQgVVJMIHRvIG9wZW4NCg0KZnVuY3Rpb24gZ2V0SFRUUE9iamVjdCgpIHsNCiAgdmFyIHhtbGh0dHAgPSBmYWxzZTsNCg0KICAvKiBDb21waWxhdGlvbiBjb25kaXRpb25uZWxsZSBkJ0lFICovDQogIC8qQGNjX29uDQogIEBpZiAoQF9qc2NyaXB0X3ZlcnNpb24gPj0gNSkNCiAgICAgdHJ5IHsNCiAgICAgICAgeG1saHR0cCA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNc3htbDIuWE1MSFRUUCIpOw0KICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgIHhtbGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsNCiAgICAgICAgfSBjYXRjaCAoRSkgew0KICAgICAgICAgICB4bWxodHRwID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgfQ0KICBAZWxzZQ0KICAgICB4bWxodHRwID0gZmFsc2U7DQogIEBlbmQgQCovDQoNCiAgLyogb24gZXNzYWllIGRlIGNy6WVyIGwnb2JqZXQgc2kgY2Ugbidlc3QgcGFzIGTpauAgZmFpdCAqLw0KICBpZiAoIXhtbGh0dHAgJiYgdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9ICd1bmRlZmluZWQnKSB7DQogICAgIHRyeSB7DQogICAgICAgIHhtbGh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsNCiAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICB4bWxodHRwID0gZmFsc2U7DQogICAgIH0NCiAgfQ0KDQogIGlmICh4bWxodHRwKSB7DQogICAgIC8qIG9uIGTpZmluaXQgY2UgcXVpIGRvaXQgc2UgcGFzc2VyIHF1YW5kIGxhIHBhZ2Ugculwb25kcmEgKi8NCiAgICAgeG1saHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKSB7DQogICAgICAgIGlmICh4bWxodHRwLnJlYWR5U3RhdGUgPT0gNCkgeyAvKiA0IDog6XRhdCAiY29tcGxldGUiICovDQogICAgICAgICAgIHZhciByZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXNwb25zZSIpOw0KICAgICAgICAgICB2YXIgcmVzcG9uc2VTdGF0dXMgPSAiIjsNCiAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICByZXNwb25zZVN0YXR1cyA9IHhtbGh0dHAuc3RhdHVzICsgIiI7DQogICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICByZXNwb25zZVN0YXR1cyA9ICJFUlJPUiBXSElMRSBSRVRSSUVWSU5HIFNUQVRVUzsgTUFZQkUgVU5BQkxFIFRPIENPTk5FQ1QuIjsNCiAgICAgICAgICAgfQ0KICAgICAgICAgICByZXNwb25zZS52YWx1ZSA9ICJTVEFUVVM6ICIgKyByZXNwb25zZVN0YXR1cyArICJcbiIgKyB4bWxodHRwLnJlc3BvbnNlVGV4dDsNCiAgICAgICAgfQ0KICAgICB9DQogIH0NCiAgcmV0dXJuIHhtbGh0dHA7DQp9DQoNCmZ1bmN0aW9uIHNlbmQoKSB7DQogIGlmICgoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVybFRvT3BlbiIpLnZhbHVlICE9IHVybFRvT3BlbikgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1cmxUb09wZW4iKS52YWx1ZSAhPSAiIikpIHsNCiAgICAvL3VzZSB1c2VyIGVudHJ5IG9ubHkgaWYgaXQgYXQgbGVhc3QgY2FuIGJlIG9rYXkNCiAgICB1cmxUb09wZW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXJsVG9PcGVuIikudmFsdWU7DQogIH0gIA0KICB2YXIgeG1saHR0cCA9IGdldEhUVFBPYmplY3QoKTsNCiAgaWYgKCF4bWxodHRwKSB7DQogICAgYWxlcnQoJ2NvdW5kIG5vdCBjcmVhdGUgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0Jyk7DQogICAgcmV0dXJuOw0KICB9DQogIHZhciByZXF1ZXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlcXVlc3QiKTsNCiAgdmFyIHJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3BvbnNlIik7DQogIHRyeSB7DQogICAgbmV0c2NhcGUuc2VjdXJpdHkuUHJpdmlsZWdlTWFuYWdlci5lbmFibGVQcml2aWxlZ2UoIlVuaXZlcnNhbEJyb3dzZXJSZWFkIFVuaXZlcnNhbEJyb3dzZXJXcml0ZSIpOw0KICB9IGNhdGNoIChlKSB7DQogIH0NCiAgdHJ5IHsNCiAgICB4bWxodHRwLm9wZW4oIlBPU1QiLCB1cmxUb09wZW4sIHRydWUpOw0KICB9IGNhdGNoIChlKSB7DQogICAgYWxlcnQoJ2Vycm9yIG9wZW5pbmcnKTsNCiAgfQ0KICB4bWxodHRwLnNlbmQocmVxdWVzdC52YWx1ZSk7DQp9DQoNCjwvc2NyaXB0Pg0KPC9oZWFkPg0KDQo8Ym9keT4NCg0KPGgxPlNlcnZpY2VNaXggV1NETC1GaXJzdCBFeGFtcGxlPC9oMT4NCg0KPHA+V2VsY29tZSB0byB0aGUgV1NETC1GaXJzdCBleGFtcGxlIGZvciBTZXJ2aWNlTWl4PC9wPg0KDQo8cD5QZXJmb3JtIGEgUE9TVCBpbnRvIHRoZSBIVFRQIGJpbmRpbmcuIFRoaXMgcmVxdWlyZXMgSmF2YVNjcmlwdC48L3A+IA0KPHA+VGFyZ2V0OiA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iNTAiIGlkPSJ1cmxUb09wZW4iIHZhbHVlPSIiPjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXJsVG9PcGVuIikudmFsdWUgPSB1cmxUb09wZW47PC9zY3JpcHQ+LjwvcD4NCiAgDQo8dGFibGU+DQogIDx0cj4NCiAgICA8dGQ+DQogIDx0ZXh0YXJlYSBpZD0icmVxdWVzdCIgc3R5bGU9IndpZHRoOjYwMHB4O2hlaWdodDo0MDBweCIgb25LZXlVcD0ic2VuZCgpOyI+PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyINCiAgICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc2VydmljZW1peC5hcGFjaGUub3JnL3NhbXBsZXMvd3NkbC1maXJzdC90eXBlcyI+DQogIDxlbnY6Qm9keT4NCiAgICA8dG5zOkdldFBlcnNvbj4NCiAgICAgIDx0bnM6cGVyc29uSWQ+d29ybGQ8L3RuczpwZXJzb25JZD4NCiAgICA8L3RuczpHZXRQZXJzb24+DQogIDwvZW52OkJvZHk+DQo8L2VudjpFbnZlbG9wZT4NCg0KICA8L3RleHRhcmVhPg0KICAgIDwvdGQ+DQogICAgPHRkPg0KICA8dGV4dGFyZWEgaWQ9InJlc3BvbnNlIiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjQwMHB4Ij4NCiAgPC90ZXh0YXJlYT4NCiAgICA8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNvbHNwYW49Mj4NCiAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlNlbmQiIG9uQ2xpY2s9InNlbmQoKTsiLz4NCiAgICA8L3RkPg0KICA8L3RyPg0KPC90YWJsZT4NCjwvYm9keT4NCjwvaHRtbD4NCg==