ZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9BYnN0cmFjdEh0dHBGaWx0ZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9BYnN0cmFjdEh0dHBGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJlMTJkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Fic3RyYWN0SHR0cEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdHRwRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcSwgU2VydmxldFJlc3BvbnNlIHJlcywgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgIGRvRmlsdGVyKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcSwgKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHJlcywgY2hhaW4pOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSAvLyBBbGxvdyBzdWJjbGFzc2VzIHRvIHRocm93IFNlcnZsZXRFeGNlcHRpb24uCisgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgIH0KKworICAvKiogQHNlZSAjZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSwgRmlsdGVyQ2hhaW4pICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRvRmlsdGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9CYXNlU2VydmxldC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Jhc2VTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkYzE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9CYXNlU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSHR0cEhlYWRlcnM7CisKK2ltcG9ydCBvcmcuam9kYS50aW1lLkluc3RhbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIEJhc2Ugc2VydmxldCBjbGFzcyBmb3IgR2l0aWxlcyBzZXJ2bGV0cyB0aGF0IHNlcnZlIFNveSB0ZW1wbGF0ZXMuICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FUVFJJQlVURSA9IEJhc2VTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSArICIvRGF0YSI7CisKKyAgc3RhdGljIHZvaWQgc2V0Tm90Q2FjaGVhYmxlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgcmVzLnNldEhlYWRlcihIdHRwSGVhZGVycy5DQUNIRV9DT05UUk9MLCAibm8tY2FjaGUsIG5vLXN0b3JlLCBtYXgtYWdlPTAsIG11c3QtcmV2YWxpZGF0ZSIpOworICAgIHJlcy5zZXRIZWFkZXIoSHR0cEhlYWRlcnMuUFJBR01BLCAibm8tY2FjaGUiKTsKKyAgICByZXMuc2V0SGVhZGVyKEh0dHBIZWFkZXJzLkVYUElSRVMsICJGcmksIDAxIEphbiAxOTkwIDAwOjAwOjAwIEdNVCIpOworICAgIHJlcy5zZXREYXRlSGVhZGVyKEh0dHBIZWFkZXJzLkRBVEUsIG5ldyBJbnN0YW50KCkuZ2V0TWlsbGlzKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBCYXNlU2VydmxldCBub3RGb3VuZFNlcnZsZXQoKSB7CisgICAgcmV0dXJuIG5ldyBCYXNlU2VydmxldChudWxsKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbWVudUVudHJ5KFN0cmluZyB0ZXh0LCBTdHJpbmcgdXJsKSB7CisgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgdGV4dCwgInVybCIsIHVybCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoInRleHQiLCB0ZXh0KTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0RGF0YShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHJlcS5nZXRBdHRyaWJ1dGUoREFUQV9BVFRSSUJVVEUpOworICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgIGRhdGEgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoREFUQV9BVFRSSUJVVEUsIGRhdGEpOworICAgIH0KKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCisgIHByb3RlY3RlZCBmaW5hbCBSZW5kZXJlciByZW5kZXJlcjsKKworICBwcm90ZWN0ZWQgQmFzZVNlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIpIHsKKyAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7CisgIH0KKworICAvKioKKyAgICogUHV0IGEgdmFsdWUgaW50byBhIHJlcXVlc3QncyBTb3kgZGF0YSBtYXAuCisgICAqIDxwPgorICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBzdXBwb3J0IGEgY29tcG9zaXRpb24gcGF0dGVybiB3aGVyZWJ5IGEKKyAgICoge0BsaW5rIEJhc2VTZXJ2bGV0fSBpcyB3cmFwcGVkIGluIGEgZGlmZmVyZW50IHtAbGluayBIdHRwU2VydmxldH0gdGhhdCBjYW4KKyAgICogdXBkYXRlIGl0cyBkYXRhIG1hcC4KKyAgICoKKyAgICogQHBhcmFtIHJlcSBpbi1wcm9ncmVzcyByZXF1ZXN0LgorICAgKiBAcGFyYW0ga2V5IGtleS4KKyAgICogQHBhcmFtIHZhbHVlIFNveSBkYXRhIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHZvaWQgcHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgIGdldERhdGEocmVxKS5wdXQoa2V5LCB2YWx1ZSk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCByZW5kZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZW1wbGF0ZU5hbWUsCisgICAgICBNYXA8U3RyaW5nLCA/PiBzb3lEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXMuc2V0Q29udGVudFR5cGUoRm9ybWF0VHlwZS5IVE1MLmdldE1pbWVUeXBlKCkpOworICAgICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKENoYXJzZXRzLlVURl84Lm5hbWUoKSk7CisgICAgICBzZXRDYWNoZUhlYWRlcnMocmVxLCByZXMpOworCisgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFsbERhdGEgPSBnZXREYXRhKHJlcSk7CisgICAgICBhbGxEYXRhLnB1dEFsbChzb3lEYXRhKTsKKyAgICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICAgIGlmICghYWxsRGF0YS5jb250YWluc0tleSgicmVwb3NpdG9yeU5hbWUiKSAmJiB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICBhbGxEYXRhLnB1dCgicmVwb3NpdG9yeU5hbWUiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgICAgfQorICAgICAgaWYgKCFhbGxEYXRhLmNvbnRhaW5zS2V5KCJicmVhZGNydW1icyIpKSB7CisgICAgICAgIGFsbERhdGEucHV0KCJicmVhZGNydW1icyIsIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgICAgICB9CisKKyAgICAgIHJlcy5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7CisgICAgICByZW5kZXJlci5yZW5kZXIocmVzLCB0ZW1wbGF0ZU5hbWUsIGFsbERhdGEpOworICAgIH0gZmluYWxseSB7CisgICAgICByZXEucmVtb3ZlQXR0cmlidXRlKERBVEFfQVRUUklCVVRFKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBzZXRDYWNoZUhlYWRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICBzZXROb3RDYWNoZWFibGUocmVzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Jsb2JTb3lEYXRhLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQmxvYlNveURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU3Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Jsb2JTb3lEYXRhLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQ09NTUlUOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLlJhd1RleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTGFyZ2VPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKiogU295IGRhdGEgY29udmVydGVyIGZvciBnaXQgYmxvYnMuICovCitwdWJsaWMgY2xhc3MgQmxvYlNveURhdGEgeworICAvKioKKyAgICogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gbG9hZCBmcm9tIGEgc3VwcG9zZWQgdGV4dCBmaWxlIGZvciBkaXNwbGF5LgorICAgKiBGaWxlcyBsYXJnZXIgdGhhbiB0aGlzIHdpbGwgYmUgZGlzcGxheWVkIGFzIGJpbmFyeSBmaWxlcywgZXZlbiBpZiB0aGUKKyAgICogY29udGVudHMgd2FzIHRleHQuIEZvciBleGFtcGxlIHJlYWxseSBiaWcgWE1MIGZpbGVzIG1heSBiZSBhYm92ZSB0aGlzIGxpbWl0CisgICAqIGFuZCB3aWxsIGdldCBkaXNwbGF5ZWQgYXMgYmluYXJ5LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9GSUxFX1NJWkUgPSAxMCA8PCAyMDsKKworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNWaWV3IHZpZXc7CisgIHByaXZhdGUgZmluYWwgUmV2V2FsayB3YWxrOworCisgIHB1YmxpYyBCbG9iU295RGF0YShSZXZXYWxrIHdhbGssIEdpdGlsZXNWaWV3IHZpZXcpIHsKKyAgICB0aGlzLnZpZXcgPSB2aWV3OworICAgIHRoaXMud2FsayA9IHdhbGs7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b1NveURhdGEoT2JqZWN0SWQgYmxvYklkKQorICAgICAgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdG9Tb3lEYXRhKG51bGwsIGJsb2JJZCk7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b1NveURhdGEoU3RyaW5nIHBhdGgsIE9iamVjdElkIGJsb2JJZCkKKyAgICAgIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZSg0KTsKKyAgICBkYXRhLnB1dCgic2hhIiwgT2JqZWN0SWQudG9TdHJpbmcoYmxvYklkKSk7CisKKyAgICBPYmplY3RMb2FkZXIgbG9hZGVyID0gd2Fsay5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKGJsb2JJZCwgQ29uc3RhbnRzLk9CSl9CTE9CKTsKKyAgICBTdHJpbmcgY29udGVudDsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIHJhdyA9IGxvYWRlci5nZXRDYWNoZWRCeXRlcyhNQVhfRklMRV9TSVpFKTsKKyAgICAgIGNvbnRlbnQgPSAhUmF3VGV4dC5pc0JpbmFyeShyYXcpID8gUmF3UGFyc2VVdGlscy5kZWNvZGUocmF3KSA6IG51bGw7CisgICAgfSBjYXRjaCAoTGFyZ2VPYmplY3RFeGNlcHRpb24uT3V0T2ZNZW1vcnkgZSkgeworICAgICAgdGhyb3cgZTsKKyAgICB9IGNhdGNoIChMYXJnZU9iamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICBjb250ZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICBkYXRhLnB1dCgiZGF0YSIsIGNvbnRlbnQpOworICAgIGlmIChjb250ZW50ICE9IG51bGwpIHsKKyAgICAgIGRhdGEucHV0KCJsYW5nIiwgZ3Vlc3NQcmV0dGlmeUxhbmcocGF0aCwgY29udGVudCkpOworICAgIH0gZWxzZSBpZiAoY29udGVudCA9PSBudWxsKSB7CisgICAgICBkYXRhLnB1dCgic2l6ZSIsIExvbmcudG9TdHJpbmcobG9hZGVyLmdldFNpemUoKSkpOworICAgIH0KKyAgICBpZiAocGF0aCAhPSBudWxsICYmIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRQZWVsZWRUeXBlKCkgPT0gT0JKX0NPTU1JVCkgeworICAgICAgZGF0YS5wdXQoImxvZ1VybCIsIEdpdGlsZXNWaWV3LmxvZygpLmNvcHlGcm9tKHZpZXcpLnRvVXJsKCkpOworICAgIH0KKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBndWVzc1ByZXR0aWZ5TGFuZyhTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICBpZiAoY29udGVudC5zdGFydHNXaXRoKCIjIS9iaW4vc2giKSB8fCBjb250ZW50LnN0YXJ0c1dpdGgoIiMhL2Jpbi9iYXNoIikpIHsKKyAgICAgIHJldHVybiAic2giOworICAgIH0gZWxzZSBpZiAoY29udGVudC5zdGFydHNXaXRoKCIjIS91c3IvYmluL3BlcmwiKSkgeworICAgICAgcmV0dXJuICJwZXJsIjsKKyAgICB9IGVsc2UgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgiIyEvdXNyL2Jpbi9weXRob24iKSkgeworICAgICAgcmV0dXJuICJweSI7CisgICAgfSBlbHNlIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGludCBzbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICBpbnQgZG90ID0gcGF0aC5sYXN0SW5kZXhPZignLicpOworICAgIFN0cmluZyBsYW5nID0gKCgwIDwgZG90KSAmJiAoc2xhc2ggPCBkb3QpKSA/IHBhdGguc3Vic3RyaW5nKGRvdCArIDEpIDogbnVsbDsKKyAgICBpZiAoInR4dCIuZXF1YWxzSWdub3JlQ2FzZShsYW5nKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlIGlmICgibWsiLmVxdWFsc0lnbm9yZUNhc2UobGFuZykpIHsKKyAgICAgIHJldHVybiAic2giOworICAgIH0gZWxzZSBpZiAoIk1ha2VmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHBhdGgpCisgICAgICAgIHx8ICgoMCA8IHNsYXNoKSAmJiAiTWFrZWZpbGUiLmVxdWFsc0lnbm9yZUNhc2UocGF0aC5zdWJzdHJpbmcoc2xhc2ggKyAxKSkpKSB7CisgICAgICByZXR1cm4gInNoIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGxhbmc7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29tbWl0U295RGF0YS5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbW1pdFNveURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjhhOTdkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbW1pdFNveURhdGEuamF2YQpAQCAtMCwwICsxLDI4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS50ZW1wbGF0ZS5zb3kuZGF0YS5yZXN0cmljdGVkLk51bGxEYXRhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LkNoYW5nZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQWJzdHJhY3RUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5DYW5vbmljYWxUcmVlUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRW1wdHlUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkdpdERhdGVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkdpdERhdGVGb3JtYXR0ZXIuRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SZWxhdGl2ZURhdGVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiBTb3kgZGF0YSBjb252ZXJ0ZXIgZm9yIGdpdCBjb21taXRzLiAqLworcHVibGljIGNsYXNzIENvbW1pdFNveURhdGEgeworICAvKiogVmFsaWQgc2V0cyBvZiBrZXlzIHRvIGluY2x1ZGUgaW4gU295IGRhdGEgZm9yIGNvbW1pdHMuICovCisgIHB1YmxpYyBzdGF0aWMgZW51bSBLZXlTZXQgeworICAgIERFVEFJTCgiYXV0aG9yIiwgImNvbW1pdHRlciIsICJzaGEiLCAidHJlZSIsICJ0cmVlVXJsIiwgInBhcmVudHMiLCAibWVzc2FnZSIsICJsb2dVcmwiKSwKKyAgICBERVRBSUxfRElGRl9UUkVFKERFVEFJTCwgImRpZmZUcmVlIiksCisgICAgU0hPUlRMT0coImFiYnJldlNoYSIsICJ1cmwiLCAic2hvcnRNZXNzYWdlIiwgImF1dGhvciIsICJicmFuY2hlcyIsICJ0YWdzIiksCisgICAgREVGQVVMVChERVRBSUwpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBrZXlzOworCisgICAgcHJpdmF0ZSBLZXlTZXQoU3RyaW5nLi4uIGtleXMpIHsKKyAgICAgIHRoaXMua2V5cyA9IEltbXV0YWJsZVNldC5jb3B5T2Yoa2V5cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBLZXlTZXQoS2V5U2V0IG90aGVyLCBTdHJpbmcuLi4ga2V5cykgeworICAgICAgdGhpcy5rZXlzID0gSW1tdXRhYmxlU2V0LjxTdHJpbmc+IGJ1aWxkZXIoKS5hZGRBbGwob3RoZXIua2V5cykuYWRkKGtleXMpLmJ1aWxkKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBMaW5raWZpZXIgbGlua2lmaWVyOworICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXE7CisgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSByZXBvOworICBwcml2YXRlIGZpbmFsIFJldldhbGsgd2FsazsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzVmlldyB2aWV3OworICBwcml2YXRlIGZpbmFsIE1hcDxBbnlPYmplY3RJZCwgU2V0PFJlZj4+IHJlZnNCeUlkOworICBwcml2YXRlIGZpbmFsIEdpdERhdGVGb3JtYXR0ZXIgZGF0ZUZvcm1hdHRlcjsKKworICAvLyBUT0RPKGRib3Jvd2l0eik6IFRoaXMgY29uc3RydWN0b3IgaXMgZ2V0dGluZyBhIGJpdCByaWRpY3Vsb3VzLgorICBwdWJsaWMgQ29tbWl0U295RGF0YShATnVsbGFibGUgTGlua2lmaWVyIGxpbmtpZmllciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSByZXBvLAorICAgICAgUmV2V2FsayB3YWxrLCBHaXRpbGVzVmlldyB2aWV3KSB7CisgICAgdGhpcyhsaW5raWZpZXIsIHJlcSwgcmVwbywgd2FsaywgdmlldywgbnVsbCk7CisgIH0KKworICBwdWJsaWMgQ29tbWl0U295RGF0YShATnVsbGFibGUgTGlua2lmaWVyIGxpbmtpZmllciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSByZXBvLAorICAgICAgUmV2V2FsayB3YWxrLCBHaXRpbGVzVmlldyB2aWV3LCBATnVsbGFibGUgTWFwPEFueU9iamVjdElkLCBTZXQ8UmVmPj4gcmVmc0J5SWQpIHsKKyAgICB0aGlzLmxpbmtpZmllciA9IGxpbmtpZmllcjsKKyAgICB0aGlzLnJlcSA9IHJlcTsKKyAgICB0aGlzLnJlcG8gPSByZXBvOworICAgIHRoaXMud2FsayA9IHdhbGs7CisgICAgdGhpcy52aWV3ID0gdmlldzsKKyAgICB0aGlzLnJlZnNCeUlkID0gcmVmc0J5SWQ7CisgICAgdGhpcy5kYXRlRm9ybWF0dGVyID0gbmV3IEdpdERhdGVGb3JtYXR0ZXIoRm9ybWF0LkRFRkFVTFQpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Tb3lEYXRhKFJldkNvbW1pdCBjb21taXQsIEtleVNldCBrZXlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoS2V5U2V0LkRFRkFVTFQua2V5cy5zaXplKCkpOworICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoImF1dGhvciIpKSB7CisgICAgICBkYXRhLnB1dCgiYXV0aG9yIiwgdG9Tb3lEYXRhKGNvbW1pdC5nZXRBdXRob3JJZGVudCgpLCBkYXRlRm9ybWF0dGVyKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoImNvbW1pdHRlciIpKSB7CisgICAgICBkYXRhLnB1dCgiY29tbWl0dGVyIiwgdG9Tb3lEYXRhKGNvbW1pdC5nZXRDb21taXR0ZXJJZGVudCgpLCBkYXRlRm9ybWF0dGVyKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoInNoYSIpKSB7CisgICAgICBkYXRhLnB1dCgic2hhIiwgT2JqZWN0SWQudG9TdHJpbmcoY29tbWl0KSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoImFiYnJldlNoYSIpKSB7CisgICAgICBPYmplY3RSZWFkZXIgcmVhZGVyID0gcmVwby5nZXRPYmplY3REYXRhYmFzZSgpLm5ld1JlYWRlcigpOworICAgICAgdHJ5IHsKKyAgICAgICAgZGF0YS5wdXQoImFiYnJldlNoYSIsIHJlYWRlci5hYmJyZXZpYXRlKGNvbW1pdCkubmFtZSgpKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHJlYWRlci5yZWxlYXNlKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoInVybCIpKSB7CisgICAgICBkYXRhLnB1dCgidXJsIiwgR2l0aWxlc1ZpZXcucmV2aXNpb24oKQorICAgICAgICAgIC5jb3B5RnJvbSh2aWV3KQorICAgICAgICAgIC5zZXRSZXZpc2lvbihjb21taXQpCisgICAgICAgICAgLnRvVXJsKCkpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJsb2dVcmwiKSkgeworICAgICAgUmV2aXNpb24gcmV2ID0gdmlldy5nZXRSZXZpc2lvbigpOworICAgICAgR2l0aWxlc1ZpZXcuQnVpbGRlciBsb2dWaWV3ID0gR2l0aWxlc1ZpZXcubG9nKCkKKyAgICAgICAgICAuY29weUZyb20odmlldykKKyAgICAgICAgICAuc2V0UmV2aXNpb24ocmV2LmdldElkKCkuZXF1YWxzKGNvbW1pdCkgPyByZXYuZ2V0TmFtZSgpIDogY29tbWl0Lm5hbWUoKSwgY29tbWl0KQorICAgICAgICAgIC5zZXRPbGRSZXZpc2lvbihSZXZpc2lvbi5OVUxMKQorICAgICAgICAgIC5zZXRUcmVlUGF0aChudWxsKTsKKyAgICAgIGRhdGEucHV0KCJsb2dVcmwiLCBsb2dWaWV3LnRvVXJsKCkpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJ0cmVlIikpIHsKKyAgICAgIGRhdGEucHV0KCJ0cmVlIiwgT2JqZWN0SWQudG9TdHJpbmcoY29tbWl0LmdldFRyZWUoKSkpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJ0cmVlVXJsIikpIHsKKyAgICAgIGRhdGEucHV0KCJ0cmVlVXJsIiwgR2l0aWxlc1ZpZXcucGF0aCgpLmNvcHlGcm9tKHZpZXcpLnNldFRyZWVQYXRoKCIvIikudG9VcmwoKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoInBhcmVudHMiKSkgeworICAgICAgZGF0YS5wdXQoInBhcmVudHMiLCB0b1NveURhdGEodmlldywgY29tbWl0LmdldFBhcmVudHMoKSkpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJzaG9ydE1lc3NhZ2UiKSkgeworICAgICAgZGF0YS5wdXQoInNob3J0TWVzc2FnZSIsIGNvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKSk7CisgICAgfQorICAgIGlmIChrZXlzLmtleXMuY29udGFpbnMoImJyYW5jaGVzIikpIHsKKyAgICAgIGRhdGEucHV0KCJicmFuY2hlcyIsIGdldFJlZnNCeUlkKGNvbW1pdCwgQ29uc3RhbnRzLlJfSEVBRFMpKTsKKyAgICB9CisgICAgaWYgKGtleXMua2V5cy5jb250YWlucygidGFncyIpKSB7CisgICAgICBkYXRhLnB1dCgidGFncyIsIGdldFJlZnNCeUlkKGNvbW1pdCwgQ29uc3RhbnRzLlJfVEFHUykpOworICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJtZXNzYWdlIikpIHsKKyAgICAgIGlmIChsaW5raWZpZXIgIT0gbnVsbCkgeworICAgICAgICBkYXRhLnB1dCgibWVzc2FnZSIsIGxpbmtpZmllci5saW5raWZ5KHJlcSwgY29tbWl0LmdldEZ1bGxNZXNzYWdlKCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEucHV0KCJtZXNzYWdlIiwgY29tbWl0LmdldEZ1bGxNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoa2V5cy5rZXlzLmNvbnRhaW5zKCJkaWZmVHJlZSIpKSB7CisgICAgICBkYXRhLnB1dCgiZGlmZlRyZWUiLCBjb21wdXRlRGlmZlRyZWUoY29tbWl0KSk7CisgICAgfQorICAgIGNoZWNrU3RhdGUoa2V5cy5rZXlzLnNpemUoKSA9PSBkYXRhLnNpemUoKSwgImJhZCBjb21taXQgZGF0YSBrZXlzOiAlcyAhPSAlcyIsIGtleXMua2V5cywKKyAgICAgICAgZGF0YS5rZXlTZXQoKSk7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5jb3B5T2YoZGF0YSk7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b1NveURhdGEoUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdG9Tb3lEYXRhKGNvbW1pdCwgS2V5U2V0LkRFRkFVTFQpOworICB9CisKKyAgLy8gVE9ETyhkYm9yb3dpdHopOiBFeHRyYWN0IHRoaXMuCisgIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHRvU295RGF0YShQZXJzb25JZGVudCBpZGVudCwgR2l0RGF0ZUZvcm1hdHRlciBkYXRlRm9ybWF0dGVyKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgIm5hbWUiLCBpZGVudC5nZXROYW1lKCksCisgICAgICAgICJlbWFpbCIsIGlkZW50LmdldEVtYWlsQWRkcmVzcygpLAorICAgICAgICAidGltZSIsIGRhdGVGb3JtYXR0ZXIuZm9ybWF0RGF0ZShpZGVudCksCisgICAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogU3dpdGNoIGZyb20gcmVsYXRpdmUgdG8gYWJzb2x1dGUgYXQgc29tZSB0aHJlc2hvbGQuCisgICAgICAgICJyZWxhdGl2ZVRpbWUiLCBSZWxhdGl2ZURhdGVGb3JtYXR0ZXIuZm9ybWF0KGlkZW50LmdldFdoZW4oKSkpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IHRvU295RGF0YShHaXRpbGVzVmlldyB2aWV3LCBSZXZDb21taXRbXSBwYXJlbnRzKSB7CisgICAgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocGFyZW50cy5sZW5ndGgpOworICAgIGludCBpID0gMTsKKyAgICAvLyBUT0RPKGRib3Jvd2l0eik6IFJlbmRlciBzb21ldGhpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IHdoZW4gd2UncmUgYWN0aXZlbHkKKyAgICAvLyB2aWV3aW5nIGEgZGlmZiBhZ2FpbnN0IG9uZSBvZiB0aGUgcGFyZW50cy4KKyAgICBmb3IgKFJldkNvbW1pdCBwYXJlbnQgOiBwYXJlbnRzKSB7CisgICAgICBTdHJpbmcgbmFtZSA9IHBhcmVudC5uYW1lKCk7CisgICAgICBHaXRpbGVzVmlldy5CdWlsZGVyIGRpZmYgPSBHaXRpbGVzVmlldy5kaWZmKCkuY29weUZyb20odmlldykuc2V0VHJlZVBhdGgoIiIpOworICAgICAgU3RyaW5nIHBhcmVudE5hbWU7CisgICAgICBpZiAocGFyZW50cy5sZW5ndGggPT0gMSkgeworICAgICAgICBwYXJlbnROYW1lID0gdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSArICJeIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcmVudE5hbWUgPSB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpICsgIl4iICsgKGkrKyk7CisgICAgICB9CisgICAgICByZXN1bHQuYWRkKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAic2hhIiwgbmFtZSwKKyAgICAgICAgICAidXJsIiwgR2l0aWxlc1ZpZXcucmV2aXNpb24oKQorICAgICAgICAgICAgICAuY29weUZyb20odmlldykKKyAgICAgICAgICAgICAgLnNldFJldmlzaW9uKHBhcmVudE5hbWUsIHBhcmVudCkKKyAgICAgICAgICAgICAgLnRvVXJsKCksCisgICAgICAgICAgImRpZmZVcmwiLCBkaWZmLnNldE9sZFJldmlzaW9uKHBhcmVudE5hbWUsIHBhcmVudCkudG9VcmwoKSkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBnZXRUcmVlSXRlcmF0b3IoUmV2V2FsayB3YWxrLCBSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIENhbm9uaWNhbFRyZWVQYXJzZXIgcCA9IG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKCk7CisgICAgcC5yZXNldCh3YWxrLmdldE9iamVjdFJlYWRlcigpLCB3YWxrLnBhcnNlVHJlZSh3YWxrLnBhcnNlQ29tbWl0KGNvbW1pdCkuZ2V0VHJlZSgpKSk7CisgICAgcmV0dXJuIHA7CisgIH0KKworICBwcml2YXRlIE9iamVjdCBjb21wdXRlRGlmZlRyZWUoUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBBYnN0cmFjdFRyZWVJdGVyYXRvciBvbGRUcmVlOworICAgIEdpdGlsZXNWaWV3LkJ1aWxkZXIgZGlmZlVybCA9IEdpdGlsZXNWaWV3LmRpZmYoKS5jb3B5RnJvbSh2aWV3KQorICAgICAgICAuc2V0VHJlZVBhdGgoIiIpOworICAgIHN3aXRjaCAoY29tbWl0LmdldFBhcmVudENvdW50KCkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgb2xkVHJlZSA9IG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpOworICAgICAgICBkaWZmVXJsLnNldE9sZFJldmlzaW9uKFJldmlzaW9uLk5VTEwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgb2xkVHJlZSA9IGdldFRyZWVJdGVyYXRvcih3YWxrLCBjb21taXQuZ2V0UGFyZW50KDApKTsKKyAgICAgICAgZGlmZlVybC5zZXRPbGRSZXZpc2lvbih2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpICsgIl4iLCBjb21taXQuZ2V0UGFyZW50KDApKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IGhhbmRsZSBtZXJnZXMKKyAgICAgICAgcmV0dXJuIE51bGxEYXRhLklOU1RBTkNFOworICAgIH0KKyAgICBBYnN0cmFjdFRyZWVJdGVyYXRvciBuZXdUcmVlID0gZ2V0VHJlZUl0ZXJhdG9yKHdhbGssIGNvbW1pdCk7CisKKyAgICBEaWZmRm9ybWF0dGVyIGRpZmYgPSBuZXcgRGlmZkZvcm1hdHRlcihOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFKTsKKyAgICB0cnkgeworICAgICAgZGlmZi5zZXRSZXBvc2l0b3J5KHJlcG8pOworICAgICAgZGlmZi5zZXREZXRlY3RSZW5hbWVzKHRydWUpOworCisgICAgICBMaXN0PE9iamVjdD4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBmb3IgKERpZmZFbnRyeSBlIDogZGlmZi5zY2FuKG9sZFRyZWUsIG5ld1RyZWUpKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDUpOworICAgICAgICBlbnRyeS5wdXQoInBhdGgiLCBlLmdldE5ld1BhdGgoKSk7CisgICAgICAgIGVudHJ5LnB1dCgidXJsIiwgR2l0aWxlc1ZpZXcucGF0aCgpCisgICAgICAgICAgICAuY29weUZyb20odmlldykKKyAgICAgICAgICAgIC5zZXRUcmVlUGF0aChlLmdldE5ld1BhdGgoKSkKKyAgICAgICAgICAgIC50b1VybCgpKTsKKyAgICAgICAgZW50cnkucHV0KCJkaWZmVXJsIiwgZGlmZlVybC5zZXRBbmNob3IoIkYiICsgcmVzdWx0LnNpemUoKSkudG9VcmwoKSk7CisgICAgICAgIGVudHJ5LnB1dCgiY2hhbmdlVHlwZSIsIGUuZ2V0Q2hhbmdlVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoZS5nZXRDaGFuZ2VUeXBlKCkgPT0gQ2hhbmdlVHlwZS5DT1BZIHx8IGUuZ2V0Q2hhbmdlVHlwZSgpID09IENoYW5nZVR5cGUuUkVOQU1FKSB7CisgICAgICAgICAgZW50cnkucHV0KCJvbGRQYXRoIiwgZS5nZXRPbGRQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hZGQoZW50cnkpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGlmZi5yZWxlYXNlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxNYXA8U3RyaW5nLCBTdHJpbmc+PiBOQU1FX0NPTVBBUkFUT1IgPQorICAgICAgbmV3IENvbXBhcmF0b3I8TWFwPFN0cmluZywgU3RyaW5nPj4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWFwPFN0cmluZywgU3RyaW5nPiBvMSwgTWFwPFN0cmluZywgU3RyaW5nPiBvMikgeworICAgICAgICAgIHJldHVybiBvMS5nZXQoIm5hbWUiKS5jb21wYXJlVG8obzIuZ2V0KCJuYW1lIikpOworICAgICAgICB9CisgICAgICB9OworCisgIHByaXZhdGUgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBnZXRSZWZzQnlJZChPYmplY3RJZCBpZCwgU3RyaW5nIHByZWZpeCkgeworICAgIGNoZWNrTm90TnVsbChyZWZzQnlJZCwgIm11c3QgcGFzcyBpbiBJRCB0byByZWYgbWFwIHRvIGxvb2sgdXAgcmVmcyBieSBJRCIpOworICAgIFNldDxSZWY+IHJlZnMgPSByZWZzQnlJZC5nZXQoaWQpOworICAgIGlmIChyZWZzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKCk7CisgICAgfQorICAgIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHJlZnMuc2l6ZSgpKTsKKyAgICBmb3IgKFJlZiByZWYgOiByZWZzKSB7CisgICAgICBpZiAocmVmLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKKyAgICAgICAgcmVzdWx0LmFkZChJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgIm5hbWUiLCByZWYuZ2V0TmFtZSgpLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpLAorICAgICAgICAgICJ1cmwiLCBHaXRpbGVzVmlldy5yZXZpc2lvbigpCisgICAgICAgICAgICAgIC5jb3B5RnJvbSh2aWV3KQorICAgICAgICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQocmVmLmdldE5hbWUoKSwgcmVmLmdldE9iamVjdElkKCkpKQorICAgICAgICAgICAgICAudG9VcmwoKSkpOworICAgICAgfQorICAgIH0KKyAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgTkFNRV9DT01QQVJBVE9SKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29uZmlnVXRpbC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbmZpZ1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjg3MzNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0NvbmZpZ1V0aWwuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGVCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuam9kYS50aW1lLkR1cmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKiBVdGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgQ29uZmlnfSBvYmplY3RzLiAqLworcHVibGljIGNsYXNzIENvbmZpZ1V0aWwgeworICAvKioKKyAgICogUmVhZCBhIGR1cmF0aW9uIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCisgICAqIDxwPgorICAgKiBEdXJhdGlvbnMgY2FuIGJlIHdyaXR0ZW4gYXMgZXhwcmVzc2lvbnMsIGZvciBleGFtcGxlIHtAY29kZSAiMSBzIn0gb3IKKyAgICoge0Bjb2RlICI1IGRheXMifS4gSWYgdW5pdHMgYXJlIG5vdCBzcGVjaWZpZWQsIG1pbGxpc2Vjb25kcyBhcmUgYXNzdW1lZC4KKyAgICoKKyAgICogQHBhcmFtIGNvbmZpZyBKR2l0IGNvbmZpZyBvYmplY3QuCisgICAqIEBwYXJhbSBzZWN0aW9uIHNlY3Rpb24gdG8gcmVhZCwgZS5nLiAiZ29vZ2xlIgorICAgKiBAcGFyYW0gc3Vic2VjdGlvbiBzdWJzZWN0aW9uIHRvIHJlYWQsIGUuZy4gImJpZ3RhYmxlIgorICAgKiBAcGFyYW0gbmFtZSB2YXJpYWJsZSB0byByZWFkLCBlLmcuICJkZWFkbGluZSIuCisgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBhc3NpZ25lZC4KKyAgICogQHJldHVybiBhIHN0YW5kYXJkIGR1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSByZWFkLCBvciBkZWZhdWx0VmFsdWUuCisgICAqLworICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGdldER1cmF0aW9uKENvbmZpZyBjb25maWcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwgU3RyaW5nIG5hbWUsCisgICAgICBEdXJhdGlvbiBkZWZhdWx0VmFsdWUpIHsKKyAgICBTdHJpbmcgdmFsU3RyID0gY29uZmlnLmdldFN0cmluZyhzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lKTsKKyAgICBpZiAodmFsU3RyID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICB2YWxTdHIgPSB2YWxTdHIudHJpbSgpOworICAgIGlmICh2YWxTdHIubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIE1hdGNoZXIgbSA9IG1hdGNoZXIoIl4oWzEtOV1bMC05XSooPzpcXC5bMC05XSopPylcXHMqKC4qKSQiLCB2YWxTdHIpOworICAgIGlmICghbS5tYXRjaGVzKCkpIHsKKyAgICAgIFN0cmluZyBrZXkgPSBzZWN0aW9uICsgKHN1YnNlY3Rpb24gIT0gbnVsbCA/ICIuIiArIHN1YnNlY3Rpb24gOiAiIikgKyAiLiIgKyBuYW1lOworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHRpbWUgdW5pdDogIiArIGtleSArICIgPSAiICsgdmFsU3RyKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZGlnaXRzID0gbS5ncm91cCgxKTsKKyAgICBTdHJpbmcgdW5pdE5hbWUgPSBtLmdyb3VwKDIpLnRyaW0oKTsKKworICAgIFRpbWVVbml0IHVuaXQ7CisgICAgaWYgKCIiLmVxdWFscyh1bml0TmFtZSkpIHsKKyAgICAgIHVuaXQgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFM7CisgICAgfSBlbHNlIGlmIChhbnlPZih1bml0TmFtZSwgIm1zIiwgIm1pbGxpcyIsICJtaWxsaXNlY29uZCIsICJtaWxsaXNlY29uZHMiKSkgeworICAgICAgdW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUzsKKyAgICB9IGVsc2UgaWYgKGFueU9mKHVuaXROYW1lLCAicyIsICJzZWMiLCAic2Vjb25kIiwgInNlY29uZHMiKSkgeworICAgICAgdW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CisgICAgfSBlbHNlIGlmIChhbnlPZih1bml0TmFtZSwgIm0iLCAibWluIiwgIm1pbnV0ZSIsICJtaW51dGVzIikpIHsKKyAgICAgIHVuaXQgPSBUaW1lVW5pdC5NSU5VVEVTOworICAgIH0gZWxzZSBpZiAoYW55T2YodW5pdE5hbWUsICJoIiwgImhyIiwgImhvdXIiLCAiaG91cnMiKSkgeworICAgICAgdW5pdCA9IFRpbWVVbml0LkhPVVJTOworICAgIH0gZWxzZSBpZiAoYW55T2YodW5pdE5hbWUsICJkIiwgImRheSIsICJkYXlzIikpIHsKKyAgICAgIHVuaXQgPSBUaW1lVW5pdC5EQVlTOworICAgIH0gZWxzZSB7CisgICAgICBTdHJpbmcga2V5ID0gc2VjdGlvbiArIChzdWJzZWN0aW9uICE9IG51bGwgPyAiLiIgKyBzdWJzZWN0aW9uIDogIiIpICsgIi4iICsgbmFtZTsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCB0aW1lIHVuaXQ6ICIgKyBrZXkgKyAiID0gIiArIHZhbFN0cik7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGlmIChkaWdpdHMuaW5kZXhPZignLicpID09IC0xKSB7CisgICAgICAgIGxvbmcgdmFsID0gTG9uZy5wYXJzZUxvbmcoZGlnaXRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbih2YWwgKiBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCgxLCB1bml0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkb3VibGUgdmFsID0gRG91YmxlLnBhcnNlRG91YmxlKGRpZ2l0cyk7CisgICAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oKGxvbmcpICh2YWwgKiBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCgxLCB1bml0KSkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgIFN0cmluZyBrZXkgPSBzZWN0aW9uICsgKHN1YnNlY3Rpb24gIT0gbnVsbCA/ICIuIiArIHN1YnNlY3Rpb24gOiAiIikgKyAiLiIgKyBuYW1lOworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHRpbWUgdW5pdDogIiArIGtleSArICIgPSAiICsgdmFsU3RyLCBuZmUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSB7QGxpbmsgQ2FjaGVCdWlsZGVyfSBmcm9tIGEgY29uZmlnLgorICAgKgorICAgKiBAcGFyYW0gY29uZmlnIEpHaXQgY29uZmlnIG9iamVjdC4KKyAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgY2FjaGUgc3Vic2VjdGlvbiB1bmRlciB0aGUgImNhY2hlIiBzZWN0aW9uLgorICAgKiBAcmV0dXJuIGEgbmV3IGNhY2hlIGJ1aWxkZXIuCisgICAqLworICBwdWJsaWMgc3RhdGljIENhY2hlQnVpbGRlcjxPYmplY3QsIE9iamVjdD4gZ2V0Q2FjaGVCdWlsZGVyKENvbmZpZyBjb25maWcsIFN0cmluZyBuYW1lKSB7CisgICAgQ2FjaGVCdWlsZGVyPE9iamVjdCwgT2JqZWN0PiBiID0gQ2FjaGVCdWlsZGVyLm5ld0J1aWxkZXIoKTsKKyAgICB0cnkgeworICAgICAgaWYgKGNvbmZpZy5nZXRTdHJpbmcoImNhY2hlIiwgbmFtZSwgIm1heGltdW1XZWlnaHQiKSAhPSBudWxsKSB7CisgICAgICAgIGIubWF4aW11bVdlaWdodChjb25maWcuZ2V0TG9uZygiY2FjaGUiLCBuYW1lLCAibWF4aW11bVdlaWdodCIsIDIwIDw8IDIwKSk7CisgICAgICB9CisgICAgICBpZiAoY29uZmlnLmdldFN0cmluZygiY2FjaGUiLCBuYW1lLCAibWF4aW11bVNpemUiKSAhPSBudWxsKSB7CisgICAgICAgIGIubWF4aW11bVNpemUoY29uZmlnLmdldExvbmcoImNhY2hlIiwgbmFtZSwgIm1heGltdW1TaXplIiwgMTYzODQpKTsKKyAgICAgIH0KKyAgICAgIER1cmF0aW9uIGV4cGlyZUFmdGVyV3JpdGUgPSBnZXREdXJhdGlvbihjb25maWcsICJjYWNoZSIsIG5hbWUsICJleHBpcmVBZnRlcldyaXRlIiwgbnVsbCk7CisgICAgICBpZiAoZXhwaXJlQWZ0ZXJXcml0ZSAhPSBudWxsKSB7CisgICAgICAgIGIuZXhwaXJlQWZ0ZXJXcml0ZShleHBpcmVBZnRlcldyaXRlLmdldE1pbGxpcygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgfQorICAgICAgRHVyYXRpb24gZXhwaXJlQWZ0ZXJBY2Nlc3MgPSBnZXREdXJhdGlvbihjb25maWcsICJjYWNoZSIsIG5hbWUsICJleHBpcmVBZnRlckFjY2VzcyIsIG51bGwpOworICAgICAgaWYgKGV4cGlyZUFmdGVyQWNjZXNzICE9IG51bGwpIHsKKyAgICAgICAgYi5leHBpcmVBZnRlckFjY2VzcyhleHBpcmVBZnRlckFjY2Vzcy5nZXRNaWxsaXMoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgIH0KKyAgICAgIC8vIEFkZCBvdGhlciBtZXRob2RzIGFzIG5lZWRlZC4KKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyBDYWNoZUJ1aWxkZXIgZm9yICIgKyBuYW1lLCBlKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyBDYWNoZUJ1aWxkZXIgZm9yICIgKyBuYW1lLCBlKTsKKyAgICB9CisgICAgcmV0dXJuIGI7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBNYXRjaGVyIG1hdGNoZXIoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyB2YWxTdHIpIHsKKyAgICAgIHJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybikubWF0Y2hlcih2YWxTdHIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbnlPZihTdHJpbmcgYSwgU3RyaW5nLi4uIGNhc2VzKSB7CisgICAgcmV0dXJuIEl0ZXJhYmxlcy5hbnkoSW1tdXRhYmxlTGlzdC5jb3B5T2YoY2FzZXMpLAorICAgICAgICBQcmVkaWNhdGVzLmVxdWFsVG8oYS50b0xvd2VyQ2FzZSgpKSk7CisgIH0KKworICBwcml2YXRlIENvbmZpZ1V0aWwoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWJ1Z1JlbmRlcmVyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVidWdSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjUxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGVidWdSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLnRlbXBsYXRlLnNveS5Tb3lGaWxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUudGVtcGxhdGUuc295LnRvZnUuU295VG9mdTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKiogUmVuZGVyZXIgdGhhdCByZWxvYWRzIFNveSB0ZW1wbGF0ZXMgZnJvbSB0aGUgZmlsZXN5c3RlbSBvbiBldmVyeSByZXF1ZXN0LiAqLworcHVibGljIGNsYXNzIERlYnVnUmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlciB7CisgIHB1YmxpYyBEZWJ1Z1JlbmRlcmVyKFN0cmluZyBzdGF0aWNQcmVmaXgsIFN0cmluZyBjdXN0b21UZW1wbGF0ZXNGaWxlbmFtZSwKKyAgICAgIGZpbmFsIFN0cmluZyBzb3lUZW1wbGF0ZXNSb290KSB7CisgICAgc3VwZXIoCisgICAgICAgIG5ldyBGdW5jdGlvbjxTdHJpbmcsIFVSTD4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFVSTCBhcHBseShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHRvRmlsZVVSTChzb3lUZW1wbGF0ZXNSb290ICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIEltbXV0YWJsZU1hcC48U3RyaW5nLCBTdHJpbmc+IG9mKCksIHN0YXRpY1ByZWZpeCwKKyAgICAgICAgdG9GaWxlVVJMKGN1c3RvbVRlbXBsYXRlc0ZpbGVuYW1lKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFNveVRvZnUgZ2V0VG9mdSgpIHsKKyAgICBTb3lGaWxlU2V0LkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTb3lGaWxlU2V0LkJ1aWxkZXIoKQorICAgICAgICAuc2V0Q29tcGlsZVRpbWVHbG9iYWxzKGdsb2JhbHMpOworICAgIGZvciAoVVJMIHRlbXBsYXRlIDogdGVtcGxhdGVzKSB7CisgICAgICB0cnkgeworICAgICAgICBjaGVja1N0YXRlKG5ldyBGaWxlKHRlbXBsYXRlLnRvVVJJKCkpLmV4aXN0cygpLCAiTWlzc2luZyBTb3kgdGVtcGxhdGUgJXMiLCB0ZW1wbGF0ZSk7CisgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgICAgYnVpbGRlci5hZGQodGVtcGxhdGUpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpLmNvbXBpbGVUb1RvZnUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRBY2Nlc3MuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0QWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2ZDgyMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0QWNjZXNzLmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlF1ZXVlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5GaWxlUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgR2l0aWxlc0FjY2Vzc30gd2l0aCBsb2NhbCByZXBvc2l0b3JpZXMuCisgKiA8cD4KKyAqIFJlcG9zaXRvcmllcyBhcmUgc2Nhbm5lZCBvbi1kZW1hbmQgdW5kZXIgdGhlIGdpdmVuIHBhdGgsIGNvbmZpZ3VyZWQgYnkKKyAqIGRlZmF1bHQgZnJvbSB7QGNvZGUgZ2l0aWxlcy5iYXNlUGF0aH0uIFRoZXJlIGlzIG5vIGFjY2VzcyBjb250cm9sIGJleW9uZCB3aGF0CisgKiB1c2VyIHRoZSBKVk0gaXMgcnVubmluZyB1bmRlci4KKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRBY2Nlc3MgaW1wbGVtZW50cyBHaXRpbGVzQWNjZXNzIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOT05ZTU9VU19VU0VSX0tFWSA9ICJhbm9ueW1vdXMgdXNlciI7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IHsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgYmFzZVBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsQmFzZVBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmFzZUdpdFVybDsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyOworCisgICAgRmFjdG9yeShGaWxlIGJhc2VQYXRoLCBTdHJpbmcgYmFzZUdpdFVybCwgRmlsZVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0aGlzLmJhc2VQYXRoID0gY2hlY2tOb3ROdWxsKGJhc2VQYXRoLCAiYmFzZVBhdGgiKTsKKyAgICAgIHRoaXMuYmFzZUdpdFVybCA9IGNoZWNrTm90TnVsbChiYXNlR2l0VXJsLCAiYmFzZUdpdFVybCIpOworICAgICAgdGhpcy5yZXNvbHZlciA9IGNoZWNrTm90TnVsbChyZXNvbHZlciwgInJlc29sdmVyIik7CisgICAgICB0aGlzLmNhbm9uaWNhbEJhc2VQYXRoID0gYmFzZVBhdGguZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBHaXRpbGVzQWNjZXNzIGZvclJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgU3RyaW5nIHBhdGggPSByZXEuZ2V0UGF0aEluZm8oKTsKKyAgICAgIFN0cmluZyByZXBvc2l0b3J5UGF0aDsKKyAgICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PSAiLyIpIHsKKyAgICAgICAgcmVwb3NpdG9yeVBhdGggPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNsYXNoUGx1cyA9IHBhdGguaW5kZXhPZigiLysvIik7CisgICAgICAgIGlmIChzbGFzaFBsdXMgPj0gMCkgeworICAgICAgICAgIHJlcG9zaXRvcnlQYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgc2xhc2hQbHVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRoLmVuZHNXaXRoKCIvKyIpKSB7CisgICAgICAgICAgcmVwb3NpdG9yeVBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVwb3NpdG9yeVBhdGggPSBwYXRoOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbmV3QWNjZXNzKGJhc2VQYXRoLCBjYW5vbmljYWxCYXNlUGF0aCwgYmFzZUdpdFVybCwgcmVzb2x2ZXIsIHJlcSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIERlZmF1bHRBY2Nlc3MgbmV3QWNjZXNzKEZpbGUgYmFzZVBhdGgsIFN0cmluZyBjYW5vbmljYWxCYXNlUGF0aCwgU3RyaW5nIGJhc2VHaXRVcmwsCisgICAgICAgIEZpbGVSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgICByZXR1cm4gbmV3IERlZmF1bHRBY2Nlc3MoYmFzZVBhdGgsIGNhbm9uaWNhbEJhc2VQYXRoLCBiYXNlR2l0VXJsLCByZXNvbHZlciwgcmVxKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgZmluYWwgRmlsZSBiYXNlUGF0aDsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjYW5vbmljYWxCYXNlUGF0aDsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBiYXNlR2l0VXJsOworICBwcm90ZWN0ZWQgZmluYWwgRmlsZVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXI7CisgIHByb3RlY3RlZCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxOworCisgIHByb3RlY3RlZCBEZWZhdWx0QWNjZXNzKEZpbGUgYmFzZVBhdGgsIFN0cmluZyBjYW5vbmljYWxCYXNlUGF0aCwgU3RyaW5nIGJhc2VHaXRVcmwsCisgICAgICBGaWxlUmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHRoaXMuYmFzZVBhdGggPSBjaGVja05vdE51bGwoYmFzZVBhdGgsICJiYXNlUGF0aCIpOworICAgIHRoaXMuY2Fub25pY2FsQmFzZVBhdGggPSBjaGVja05vdE51bGwoY2Fub25pY2FsQmFzZVBhdGgsICJjYW5vbmljYWxCYXNlUGF0aCIpOworICAgIHRoaXMuYmFzZUdpdFVybCA9IGNoZWNrTm90TnVsbChiYXNlR2l0VXJsLCAiYmFzZUdpdFVybCIpOworICAgIHRoaXMucmVzb2x2ZXIgPSBjaGVja05vdE51bGwocmVzb2x2ZXIsICJyZXNvbHZlciIpOworICAgIHRoaXMucmVxID0gY2hlY2tOb3ROdWxsKHJlcSwgInJlcSIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+IGxpc3RSZXBvc2l0b3JpZXMoU2V0PFN0cmluZz4gYnJhbmNoZXMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4gcmVwb3MgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKyAgICBmb3IgKFJlcG9zaXRvcnkgcmVwbyA6IHNjYW5SZXBvc2l0b3JpZXMoYmFzZVBhdGgsIHJlcSkpIHsKKyAgICAgIHJlcG9zLnB1dChnZXRSZXBvc2l0b3J5TmFtZShyZXBvKSwgYnVpbGREZXNjcmlwdGlvbihyZXBvLCBicmFuY2hlcykpOworICAgICAgcmVwby5jbG9zZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVwb3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBnZXRVc2VyS2V5KCkgeworICAgIC8vIEFsd2F5cyByZXR1cm4gdGhlIHNhbWUgYW5vbnltb3VzIHVzZXIga2V5IChlZmZlY3RpdmVseSBydW5uaW5nIHdpdGggdGhlCisgICAgLy8gc2FtZSB1c2VyIHBlcm1pc3Npb25zIGFzIHRoZSBKVk0pLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIGJlaGF2aW9yLgorICAgIHJldHVybiBBTk9OWU1PVVNfVVNFUl9LRVk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5TmFtZSgpIHsKKyAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeU5hbWUoU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBnZXRSZXBvc2l0b3J5RGVzY3JpcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBidWlsZERlc2NyaXB0aW9uKFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSksIENvbGxlY3Rpb25zLjxTdHJpbmc+IGVtcHR5U2V0KCkpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVwb3NpdG9yeU5hbWUoUmVwb3NpdG9yeSByZXBvKSB7CisgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVwbyk7CisgICAgaWYgKHJlcG8uaXNCYXJlKCkgJiYgcGF0aC5lbmRzV2l0aCgiLmdpdCIpKSB7CisgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDQpOworICAgIH0KKyAgICByZXR1cm4gcGF0aDsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChSZXBvc2l0b3J5IHJlcG8pIHsKKyAgICBTdHJpbmcgcGF0aCA9IHJlcG8uaXNCYXJlKCkgPyByZXBvLmdldERpcmVjdG9yeSgpLmdldFBhdGgoKSA6IHJlcG8uZ2V0RGlyZWN0b3J5KCkuZ2V0UGFyZW50KCk7CisgICAgaWYgKHJlcG8uaXNCYXJlKCkpIHsKKyAgICAgIHBhdGggPSByZXBvLmdldERpcmVjdG9yeSgpLmdldFBhdGgoKTsKKyAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIuZ2l0IikpIHsKKyAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcGF0aCA9IHJlcG8uZ2V0RGlyZWN0b3J5KCkuZ2V0UGFyZW50KCk7CisgICAgfQorICAgIHJldHVybiBnZXRSZWxhdGl2ZVBhdGgocGF0aCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICBTdHJpbmcgYmFzZSA9IGJhc2VQYXRoLmdldFBhdGgoKTsKKyAgICBpZiAocGF0aC5zdGFydHNXaXRoKGJhc2UpKSB7CisgICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoYmFzZS5sZW5ndGgoKSArIDEpOworICAgIH0KKyAgICBpZiAocGF0aC5zdGFydHNXaXRoKGNhbm9uaWNhbEJhc2VQYXRoKSkgeworICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKGNhbm9uaWNhbEJhc2VQYXRoLmxlbmd0aCgpICsgMSk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiUmVwb3NpdG9yeSBwYXRoICVzIGlzIG91dHNpZGUgYmFzZSBwYXRoICVzIiwgcGF0aCwgYmFzZSkpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgbG9hZERlc2NyaXB0aW9uVGV4dChSZXBvc2l0b3J5IHJlcG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGRlc2MgPSBudWxsOworICAgIFN0b3JlZENvbmZpZyBjb25maWcgPSByZXBvLmdldENvbmZpZygpOworICAgIElPRXhjZXB0aW9uIGNvbmZpZ0Vycm9yID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgY29uZmlnLmxvYWQoKTsKKyAgICAgIGRlc2MgPSBjb25maWcuZ2V0U3RyaW5nKCJnaXR3ZWIiLCBudWxsLCAiZGVzY3JpcHRpb24iKTsKKyAgICB9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKKyAgICAgIGNvbmZpZ0Vycm9yID0gbmV3IElPRXhjZXB0aW9uKGUpOworICAgIH0KKyAgICBpZiAoZGVzYyA9PSBudWxsKSB7CisgICAgICBGaWxlIGRlc2NGaWxlID0gbmV3IEZpbGUocmVwby5nZXREaXJlY3RvcnkoKSwgImRlc2NyaXB0aW9uIik7CisgICAgICBpZiAoZGVzY0ZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgZGVzYyA9IG5ldyBTdHJpbmcoSU8ucmVhZEZ1bGx5KGRlc2NGaWxlKSk7CisgICAgICB9IGVsc2UgaWYgKGNvbmZpZ0Vycm9yICE9IG51bGwpIHsKKyAgICAgICAgdGhyb3cgY29uZmlnRXJyb3I7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXNjOworICB9CisKKyAgcHJpdmF0ZSBSZXBvc2l0b3J5RGVzY3JpcHRpb24gYnVpbGREZXNjcmlwdGlvbihSZXBvc2l0b3J5IHJlcG8sIFNldDxTdHJpbmc+IGJyYW5jaGVzKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXBvc2l0b3J5RGVzY3JpcHRpb24gZGVzYyA9IG5ldyBSZXBvc2l0b3J5RGVzY3JpcHRpb24oKTsKKyAgICBkZXNjLm5hbWUgPSBnZXRSZXBvc2l0b3J5TmFtZShyZXBvKTsKKyAgICBkZXNjLmNsb25lVXJsID0gYmFzZUdpdFVybCArIGdldFJlbGF0aXZlUGF0aChyZXBvKTsKKyAgICBkZXNjLmRlc2NyaXB0aW9uID0gbG9hZERlc2NyaXB0aW9uVGV4dChyZXBvKTsKKyAgICBpZiAoIWJyYW5jaGVzLmlzRW1wdHkoKSkgeworICAgICAgZGVzYy5icmFuY2hlcyA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGJyYW5jaGVzKSB7CisgICAgICAgIFJlZiByZWYgPSByZXBvLmdldFJlZihub3JtYWxpemVSZWZOYW1lKG5hbWUpKTsKKyAgICAgICAgaWYgKChyZWYgIT0gbnVsbCkgJiYgKHJlZi5nZXRPYmplY3RJZCgpICE9IG51bGwpKSB7CisgICAgICAgICAgZGVzYy5icmFuY2hlcy5wdXQobmFtZSwgcmVmLmdldE9iamVjdElkKCkubmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVzYzsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBub3JtYWxpemVSZWZOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgicmVmcy8iKSkgeworICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIHJldHVybiAicmVmcy9oZWFkcy8iICsgbmFtZTsKKyAgfQorCisgIHByaXZhdGUgQ29sbGVjdGlvbjxSZXBvc2l0b3J5PiBzY2FuUmVwb3NpdG9yaWVzKGZpbmFsIEZpbGUgYmFzZVBhdGgsIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXBvc2l0b3J5PiByZXBvcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIFF1ZXVlPEZpbGU+IHRvZG8gPSBRdWV1ZXMubmV3QXJyYXlEZXF1ZSgpOworICAgIEZpbGVbXSBiYXNlRmlsZXMgPSBiYXNlUGF0aC5saXN0RmlsZXMoKTsKKyAgICBpZiAoYmFzZUZpbGVzID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiYmFzZSBwYXRoIGlzIG5vdCBhIGRpcmVjdG9yeTogIiArIGJhc2VQYXRoLmdldFBhdGgoKSk7CisgICAgfQorICAgIHRvZG8uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmFzZUZpbGVzKSk7CisgICAgd2hpbGUgKCF0b2RvLmlzRW1wdHkoKSkgeworICAgICAgRmlsZSBmaWxlID0gdG9kby5yZW1vdmUoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlcG9zLmFkZChyZXNvbHZlci5vcGVuKHJlcSwgZ2V0UmVsYXRpdmVQYXRoKGZpbGUuZ2V0UGF0aCgpKSkpOworICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gZmlsZS5saXN0RmlsZXMoKTsKKyAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICB0b2RvLmFkZEFsbChBcnJheXMuYXNMaXN0KGNoaWxkcmVuKSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVwb3M7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0UmVuZGVyZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0UmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGJkMWZiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5SZXNvdXJjZXM7CitpbXBvcnQgY29tLmdvb2dsZS50ZW1wbGF0ZS5zb3kuU295RmlsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLnRlbXBsYXRlLnNveS50b2Z1LlNveVRvZnU7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqIFJlbmRlcmVyIHRoYXQgcHJlY29tcGlsZXMgU295IGFuZCB1c2VzIHN0YXRpYyBwcmVjb21waWxlZCBDU1MuICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVyIGV4dGVuZHMgUmVuZGVyZXIgeworICBwcml2YXRlIGZpbmFsIFNveVRvZnUgdG9mdTsKKworICBEZWZhdWx0UmVuZGVyZXIoKSB7CisgICAgdGhpcygiIiwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgRGVmYXVsdFJlbmRlcmVyKFN0cmluZyBzdGF0aWNQcmVmaXgsIFVSTCBjdXN0b21UZW1wbGF0ZXMpIHsKKyAgICB0aGlzKEltbXV0YWJsZU1hcC48U3RyaW5nLCBTdHJpbmc+IG9mKCksIHN0YXRpY1ByZWZpeCwgY3VzdG9tVGVtcGxhdGVzKTsKKyAgfQorCisgIHB1YmxpYyBEZWZhdWx0UmVuZGVyZXIoTWFwPFN0cmluZywgU3RyaW5nPiBnbG9iYWxzLCBTdHJpbmcgc3RhdGljUHJlZml4LCBVUkwgY3VzdG9tVGVtcGxhdGVzKSB7CisgICAgc3VwZXIoCisgICAgICAgIG5ldyBGdW5jdGlvbjxTdHJpbmcsIFVSTD4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFVSTCBhcHBseShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlcy5nZXRSZXNvdXJjZShSZW5kZXJlci5jbGFzcywgInRlbXBsYXRlcy8iICsgbmFtZSk7CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBnbG9iYWxzLCBzdGF0aWNQcmVmaXgsIGN1c3RvbVRlbXBsYXRlcyk7CisgICAgU295RmlsZVNldC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU295RmlsZVNldC5CdWlsZGVyKCkKKyAgICAgICAgLnNldENvbXBpbGVUaW1lR2xvYmFscyh0aGlzLmdsb2JhbHMpOworICAgIGZvciAoVVJMIHRlbXBsYXRlIDogdGVtcGxhdGVzKSB7CisgICAgICBidWlsZGVyLmFkZCh0ZW1wbGF0ZSk7CisgICAgfQorICAgIHRvZnUgPSBidWlsZGVyLmJ1aWxkKCkuY29tcGlsZVRvVG9mdSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBTb3lUb2Z1IGdldFRvZnUoKSB7CisgICAgcmV0dXJuIHRvZnU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0VXJscy5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0RlZmF1bHRVcmxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5NWI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EZWZhdWx0VXJscy5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgR2l0aWxlc1VybHN9LgorICogPHA+CisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgc3RhdGljYWxseS1jb25maWd1cmVkIGRlZmF1bHRzLCBhbmQgdGh1cyBhc3N1bWVzCisgKiB0aGF0IHRoZSBzZXJ2bGV0IGlzIHJ1bm5pbmcgYSBzaW5nbGUgdmlydHVhbCBob3N0LgorICovCitjbGFzcyBEZWZhdWx0VXJscyBpbXBsZW1lbnRzIEdpdGlsZXNVcmxzIHsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsSG9zdE5hbWU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGJhc2VHaXRVcmw7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGJhc2VHZXJyaXRVcmw7CisKKyAgRGVmYXVsdFVybHMoU3RyaW5nIGNhbm9uaWNhbEhvc3ROYW1lLCBTdHJpbmcgYmFzZUdpdFVybCwgU3RyaW5nIGJhc2VHZXJyaXRVcmwpCisgICAgICB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24geworICAgIGlmIChjYW5vbmljYWxIb3N0TmFtZSAhPSBudWxsKSB7CisgICAgICB0aGlzLmNhbm9uaWNhbEhvc3ROYW1lID0gY2Fub25pY2FsSG9zdE5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuY2Fub25pY2FsSG9zdE5hbWUgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRDYW5vbmljYWxIb3N0TmFtZSgpOworICAgIH0KKyAgICB0aGlzLmJhc2VHaXRVcmwgPSBjaGVja05vdE51bGwoYmFzZUdpdFVybCwgImJhc2VHaXRVcmwiKTsKKyAgICB0aGlzLmJhc2VHZXJyaXRVcmwgPSBjaGVja05vdE51bGwoYmFzZUdlcnJpdFVybCwgImJhc2VHZXJyaXRVcmwiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhvc3ROYW1lKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gY2Fub25pY2FsSG9zdE5hbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRCYXNlR2l0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gYmFzZUdpdFVybDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEJhc2VHZXJyaXRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHJldHVybiBiYXNlR2Vycml0VXJsOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGlmZlNlcnZsZXQuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9EaWZmU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDhjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRGlmZlNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkNhbm9uaWNhbFRyZWVQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5FbXB0eVRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5QYXRoRmlsdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogU2VydmVzIGFuIEhUTUwgcGFnZSB3aXRoIGFsbCB0aGUgZGlmZnMgZm9yIGEgY29tbWl0LiAqLworcHVibGljIGNsYXNzIERpZmZTZXJ2bGV0IGV4dGVuZHMgQmFzZVNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBQ0VIT0xERVIgPSAiaWQ9XCJESUZGX09VVFBVVF9CTE9DS1wiIjsKKworICBwcml2YXRlIGZpbmFsIExpbmtpZmllciBsaW5raWZpZXI7CisKKyAgcHVibGljIERpZmZTZXJ2bGV0KFJlbmRlcmVyIHJlbmRlcmVyLCBMaW5raWZpZXIgbGlua2lmaWVyKSB7CisgICAgc3VwZXIocmVuZGVyZXIpOworICAgIHRoaXMubGlua2lmaWVyID0gY2hlY2tOb3ROdWxsKGxpbmtpZmllciwgImxpbmtpZmllciIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpOworCisgICAgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsocmVwbyk7CisgICAgdHJ5IHsKKyAgICAgIGJvb2xlYW4gc2hvd0NvbW1pdDsKKyAgICAgIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG9sZFRyZWU7CisgICAgICBBYnN0cmFjdFRyZWVJdGVyYXRvciBuZXdUcmVlOworICAgICAgdHJ5IHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIHZpZXdpbmcgdGhlIGRpZmYgYmV0d2VlbiBhIGNvbW1pdCBhbmQgb25lIG9mIGl0cyBwYXJlbnRzLAorICAgICAgICAvLyBpbmNsdWRlIHRoZSBjb21taXQgZGV0YWlsIGluIHRoZSByZW5kZXJlZCBwYWdlLgorICAgICAgICBzaG93Q29tbWl0ID0gaXNQYXJlbnRPZih3YWxrLCB2aWV3LmdldE9sZFJldmlzaW9uKCksIHZpZXcuZ2V0UmV2aXNpb24oKSk7CisgICAgICAgIG9sZFRyZWUgPSBnZXRUcmVlSXRlcmF0b3Iod2Fsaywgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgICAgICBuZXdUcmVlID0gZ2V0VHJlZUl0ZXJhdG9yKHdhbGssIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICAgIH0gY2F0Y2ggKE1pc3NpbmdPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gY2F0Y2ggKEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gZ2V0RGF0YShyZXEpOworICAgICAgZGF0YS5wdXQoInRpdGxlIiwgIkRpZmYgLSAiICsgdmlldy5nZXRSZXZpc2lvblJhbmdlKCkpOworICAgICAgaWYgKHNob3dDb21taXQpIHsKKyAgICAgICAgZGF0YS5wdXQoImNvbW1pdCIsIG5ldyBDb21taXRTb3lEYXRhKGxpbmtpZmllciwgcmVxLCByZXBvLCB3YWxrLCB2aWV3KQorICAgICAgICAgICAgLnRvU295RGF0YSh3YWxrLnBhcnNlQ29tbWl0KHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKSkpOworICAgICAgfQorICAgICAgaWYgKCFkYXRhLmNvbnRhaW5zS2V5KCJyZXBvc2l0b3J5TmFtZSIpICYmICh2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkgIT0gbnVsbCkpIHsKKyAgICAgICAgZGF0YS5wdXQoInJlcG9zaXRvcnlOYW1lIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGlmICghZGF0YS5jb250YWluc0tleSgiYnJlYWRjcnVtYnMiKSkgeworICAgICAgICBkYXRhLnB1dCgiYnJlYWRjcnVtYnMiLCB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICAgICAgfQorCisgICAgICBTdHJpbmdbXSBodG1sID0gcmVuZGVyQW5kU3BsaXQoZGF0YSk7CisgICAgICByZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOworICAgICAgcmVzLnNldENvbnRlbnRUeXBlKEZvcm1hdFR5cGUuSFRNTC5nZXRNaW1lVHlwZSgpKTsKKyAgICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZyhDaGFyc2V0cy5VVEZfOC5uYW1lKCkpOworICAgICAgc2V0Q2FjaGVIZWFkZXJzKHJlcSwgcmVzKTsKKworICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgIHRyeSB7CisgICAgICAgIG91dC53cml0ZShodG1sWzBdLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgICAgIGZvcm1hdEh0bWxEaWZmKG91dCwgcmVwbywgd2Fsaywgb2xkVHJlZSwgbmV3VHJlZSwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICAgICAgb3V0LndyaXRlKGh0bWxbMV0uZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICB3YWxrLnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUGFyZW50T2YoUmV2V2FsayB3YWxrLCBSZXZpc2lvbiBvbGRSZXZpc2lvbiwgUmV2aXNpb24gbmV3UmV2aXNpb24pCisgICAgICB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFJldkNvbW1pdCBuZXdDb21taXQgPSB3YWxrLnBhcnNlQ29tbWl0KG5ld1JldmlzaW9uLmdldElkKCkpOworICAgIGlmIChuZXdDb21taXQuZ2V0UGFyZW50Q291bnQoKSA+IDApIHsKKyAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ld0NvbW1pdC5nZXRQYXJlbnRzKCkpLmNvbnRhaW5zKG9sZFJldmlzaW9uLmdldElkKCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gb2xkUmV2aXNpb24gPT0gUmV2aXNpb24uTlVMTDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFN0cmluZ1tdIHJlbmRlckFuZFNwbGl0KE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSkgeworICAgIFN0cmluZyBodG1sID0gcmVuZGVyZXIubmV3UmVuZGVyZXIoImdpdGlsZXMuZGlmZkRldGFpbCIpCisgICAgICAgIC5zZXREYXRhKGRhdGEpCisgICAgICAgIC5yZW5kZXIoKTsKKyAgICBpbnQgaWQgPSBodG1sLmluZGV4T2YoUExBQ0VIT0xERVIpOworICAgIGlmIChpZCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRlbXBsYXRlIG11c3QgY29udGFpbiAiICsgUExBQ0VIT0xERVIpOworICAgIH0KKworICAgIGludCBsdCA9IGh0bWwubGFzdEluZGV4T2YoJzwnLCBpZCk7CisgICAgaW50IGd0ID0gaHRtbC5pbmRleE9mKCc+JywgaWQgKyBQTEFDRUhPTERFUi5sZW5ndGgoKSk7CisgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7aHRtbC5zdWJzdHJpbmcoMCwgbHQpLCBodG1sLnN1YnN0cmluZyhndCArIDEpfTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBmb3JtYXRIdG1sRGlmZihPdXRwdXRTdHJlYW0gb3V0LAorICAgICAgUmVwb3NpdG9yeSByZXBvLCBSZXZXYWxrIHdhbGssCisgICAgICBBYnN0cmFjdFRyZWVJdGVyYXRvciBvbGRUcmVlLCBBYnN0cmFjdFRyZWVJdGVyYXRvciBuZXdUcmVlLAorICAgICAgU3RyaW5nIHBhdGgpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIERpZmZGb3JtYXR0ZXIgZGlmZiA9IG5ldyBIdG1sRGlmZkZvcm1hdHRlcihyZW5kZXJlciwgb3V0KTsKKyAgICB0cnkgeworICAgICAgaWYgKCFwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgZGlmZi5zZXRQYXRoRmlsdGVyKFBhdGhGaWx0ZXIuY3JlYXRlKHBhdGgpKTsKKyAgICAgIH0KKyAgICAgIGRpZmYuc2V0UmVwb3NpdG9yeShyZXBvKTsKKyAgICAgIGRpZmYuc2V0RGV0ZWN0UmVuYW1lcyh0cnVlKTsKKyAgICAgIGRpZmYuZm9ybWF0KG9sZFRyZWUsIG5ld1RyZWUpOworICAgIH0gZmluYWxseSB7CisgICAgICBkaWZmLnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBnZXRUcmVlSXRlcmF0b3IoUmV2V2FsayB3YWxrLCBPYmplY3RJZCBpZCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKCFpZC5lcXVhbHMoT2JqZWN0SWQuemVyb0lkKCkpKSB7CisgICAgICBDYW5vbmljYWxUcmVlUGFyc2VyIHAgPSBuZXcgQ2Fub25pY2FsVHJlZVBhcnNlcigpOworICAgICAgcC5yZXNldCh3YWxrLmdldE9iamVjdFJlYWRlcigpLCB3YWxrLnBhcnNlVHJlZShpZCkpOworICAgICAgcmV0dXJuIHA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Gb3JtYXRUeXBlLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRm9ybWF0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MTdhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRm9ybWF0VHlwZS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLm5ldC5IdHRwSGVhZGVyczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiBUeXBlIG9mIGZvcm1hdHRpbmcgdG8gdXNlIGluIHRoZSByZXNwb25zZSB0byB0aGUgY2xpZW50LiAqLworcHVibGljIGVudW0gRm9ybWF0VHlwZSB7CisgIEhUTUwoInRleHQvaHRtbCIpLAorICBURVhUKCJ0ZXh0L3BsYWluIiksCisgIEpTT04oImFwcGxpY2F0aW9uL2pzb24iKSwKKyAgREVGQVVMVCgiKi8qIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9UWVBFX0FUVFJJQlVURSA9IEZvcm1hdFR5cGUuY2xhc3MuZ2V0TmFtZSgpOworCisgIHB1YmxpYyBzdGF0aWMgRm9ybWF0VHlwZSBnZXRGb3JtYXRUeXBlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICBGb3JtYXRUeXBlIHJlc3VsdCA9IChGb3JtYXRUeXBlKSByZXEuZ2V0QXR0cmlidXRlKEZPUk1BVF9UWVBFX0FUVFJJQlVURSk7CisgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIFN0cmluZyBmb3JtYXQgPSByZXEuZ2V0UGFyYW1ldGVyKCJmb3JtYXQiKTsKKyAgICBpZiAoZm9ybWF0ICE9IG51bGwpIHsKKyAgICAgIGZvciAoRm9ybWF0VHlwZSB0eXBlIDogRm9ybWF0VHlwZS52YWx1ZXMoKSkgeworICAgICAgICBpZiAoZm9ybWF0LmVxdWFsc0lnbm9yZUNhc2UodHlwZS5uYW1lKCkpKSB7CisgICAgICAgICAgcmV0dXJuIHNldChyZXEsIHR5cGUpOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGZvcm1hdCAiICsgZm9ybWF0KTsKKyAgICB9CisKKyAgICBTdHJpbmcgYWNjZXB0ID0gcmVxLmdldEhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFQpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoYWNjZXB0KSkgeworICAgICAgcmV0dXJuIHNldChyZXEsIERFRkFVTFQpOworICAgIH0KKworICAgIGZvciAoU3RyaW5nIHAgOiBhY2NlcHQuc3BsaXQoIlsgLDtdWyAsO10qIikpIHsKKyAgICAgIGZvciAoRm9ybWF0VHlwZSB0eXBlIDogRm9ybWF0VHlwZS52YWx1ZXMoKSkgeworICAgICAgICBpZiAocC5lcXVhbHModHlwZS5taW1lVHlwZSkpIHsKKyAgICAgICAgICByZXR1cm4gc2V0KHJlcSwgdHlwZSAhPSBIVE1MID8gdHlwZSA6IERFRkFVTFQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXQocmVxLCBERUZBVUxUKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEZvcm1hdFR5cGUgc2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEZvcm1hdFR5cGUgZm9ybWF0KSB7CisgICAgcmVxLnNldEF0dHJpYnV0ZShGT1JNQVRfVFlQRV9BVFRSSUJVVEUsIGZvcm1hdCk7CisgICAgcmV0dXJuIGZvcm1hdDsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1pbWVUeXBlOworCisgIHByaXZhdGUgRm9ybWF0VHlwZShTdHJpbmcgbWltZVR5cGUpIHsKKyAgICB0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgeworICAgIHJldHVybiBtaW1lVHlwZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNBY2Nlc3MuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzQWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4ZDcwOQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzQWNjZXNzLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqCisgKiBHaXQgc3RvcmFnZSBpbnRlcmZhY2UgZm9yIEdpdGlsZXMuCisgKiA8cD4KKyAqIEVhY2ggaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIGVuZC11c2VyIHJlcXVlc3QsIHdoaWNoIGltcGxpY2l0bHkKKyAqIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0IGFuZCByZXBvc2l0b3J5LgorICovCitwdWJsaWMgaW50ZXJmYWNlIEdpdGlsZXNBY2Nlc3MgeworICAvKiogRmFjdG9yeSBmb3IgcGVyLXJlcXVlc3QgYWNjZXNzLiAqLworICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgeworICAgIHB1YmxpYyBHaXRpbGVzQWNjZXNzIGZvclJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSk7CisgIH0KKworICAvKioKKyAgICogTGlzdCByZXBvc2l0b3JpZXMgb24gdGhlIGhvc3QuCisgICAqCisgICAqIEBwYXJhbSBicmFuY2hlcyBicmFuY2hlcyB0byBsaXN0IGFsb25nIHdpdGggZWFjaCByZXBvc2l0b3J5LgorICAgKiBAcmV0dXJuIG1hcCBvZiByZXBvc2l0b3J5IG5hbWVzIHRvIGRlc2NyaXB0aW9ucy4KKyAgICogQHRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiB0byB0cmlnZ2VyIGFuIEhUVFAgNDAzIEZvcmJpZGRlbgorICAgKiAgICAgKG1hdGNoaW5nIGJlaGF2aW9yIGluIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlJlcG9zaXRvcnlGaWx0ZXJ9KS4KKyAgICogQHRocm93cyBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB0byB0cmlnZ2VyIGFuIEhUVFAgNDAxIFVuYXV0aG9yaXplZAorICAgKiAgICAgKG1hdGNoaW5nIGJlaGF2aW9yIGluIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlJlcG9zaXRvcnlGaWx0ZXJ9KS4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+IGxpc3RSZXBvc2l0b3JpZXMoU2V0PFN0cmluZz4gYnJhbmNoZXMpCisgICAgICB0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sIFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogQHJldHVybiBhbiBvcGFxdWUgb2JqZWN0IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZW5kLXVzZXIgbWFraW5nIHRoZQorICAgKiAgICAgcmVxdWVzdCwgYW5kIHN1cHBvcnRzIHtAbGluayAjZXF1YWxzKE9iamVjdCl9IGFuZCB7QGxpbmsgI2hhc2hDb2RlKCl9LgorICAgKiAgICAgTmV2ZXIgbnVsbC4KKyAgICovCisgIHB1YmxpYyBPYmplY3QgZ2V0VXNlcktleSgpOworCisgIC8qKiBAcmV0dXJuIHRoZSByZXBvc2l0b3J5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LiAqLworICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlOYW1lKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIHRoZSByZXBvc2l0b3J5IG9mIHRoaXMgcmVxdWVzdC4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBhbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZnJvbQorICAgKiAgICAgICAgIHRoZSByZXBvc2l0b3J5LgorICAgKi8KKyAgcHVibGljIFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBnZXRSZXBvc2l0b3J5RGVzY3JpcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0ZpbHRlci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNmOWVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzU2VydmxldC5TVEFUSUNfUFJFRklYOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuVmlld0ZpbHRlci5nZXRSZWdleEdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5SZXBvc2l0b3J5RmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZS5NZXRhRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5TZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuRmlsZVJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlJlcG9zaXRvcnlSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogTWV0YUZpbHRlciB0byBzZXJ2ZSBHaXRpbGVzLgorICogPHA+CisgKiBEbyBub3QgdXNlIGRpcmVjdGx5OyB1c2Uge0BsaW5rIEdpdGlsZXNTZXJ2bGV0fS4KKyAqLworY2xhc3MgR2l0aWxlc0ZpbHRlciBleHRlbmRzIE1ldGFGaWx0ZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BBVEhfUEFSQU0gPSAiY29uZmlnUGF0aCI7CisKKyAgLy8gVGhlIGZvbGxvd2luZyByZWdleGVzIGhhdmUgdGhlIGZvbGxvd2luZyBjYXB0dXJlIGdyb3VwczoKKyAgLy8gMS4gVGhlIHdob2xlIHN0cmluZywgd2hpY2ggY2F1c2VzIFJlZ2V4UGlwZWxpbmUgdG8gc2V0IFJFR0VYX0dST1VQUyBidXQKKyAgLy8gICAgbm90IG90aGVyd2lzZSBtb2RpZnkgdGhlIG9yaWdpbmFsIHJlcXVlc3QuCisgIC8vIDIuIFRoZSByZXBvc2l0b3J5IG5hbWUgcGFydCwgYmVmb3JlIC88Q01EPi4KKyAgLy8gMy4gVGhlIGNvbW1hbmQsIDxDTUQ+LCB3aXRoIG5vIHNsYXNoZXMgYW5kIGJlZ2lubmluZyB3aXRoICsuIENvbW1hbmRzIGhhdmUKKyAgLy8gICAgbmFtZXMgYW5hbG9nb3VzIHRvIChidXQgbm90IGV4YWN0bHkgdGhlIHNhbWUgYXMpIGdpdCBjb21tYW5kIG5hbWVzLCBzdWNoCisgIC8vICAgIGFzICIrbG9nIiBhbmQgIitzaG93Ii4gVGhlIGJhcmUgY29tbWFuZCAiKyIgbWFwcyB0byBvbmUgb2YgdGhlIG90aGVyCisgIC8vICAgIGNvbW1hbmRzIGJhc2VkIG9uIHRoZSByZXZpc2lvbi9wYXRoLCBhbmQgbWF5IGNoYW5nZSBvdmVyIHRpbWUuCisgIC8vIDQuIFRoZSByZXZpc2lvbi9wYXRoIHBhcnQsIGFmdGVyIC88Q01EPiAoY2FsbGVkIGp1c3QgInBhdGgiIGJlbG93KS4gVGhpcyBpcworICAvLyAgICBzcGxpdCBpbnRvIGEgcmV2aXNpb24gYW5kIGEgcGF0aCBieSBSZXZpc2lvblBhcnNlci4KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01EID0gIlxcK1thLXowLTktXSoiOworCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgZmluYWwgUGF0dGVybiBST09UX1JFR0VYID0gUGF0dGVybi5jb21waWxlKCIiCisgICAgICArICJeKCAgICAgICIgLy8gMS4gRXZlcnl0aGluZworICAgICAgKyAiICAvKiAgICAiIC8vIEV4Y2VzcyBzbGFzaGVzCisgICAgICArICIgICgvKSAgICIgLy8gMi4gUmVwbyBuYW1lIChqdXN0IHNsYXNoKQorICAgICAgKyAiICAoKSAgICAiIC8vIDMuIENvbW1hbmQKKyAgICAgICsgIiAgKCkgICAgIiAvLyA0LiBQYXRoCisgICAgICArICIpJCAgICAgICIsCisgICAgICBQYXR0ZXJuLkNPTU1FTlRTKTsKKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIGZpbmFsIFBhdHRlcm4gUkVQT19SRUdFWCA9IFBhdHRlcm4uY29tcGlsZSgiIgorICAgICAgKyAiXiggICAgICAgICAgICAgICAgICAgICAiIC8vIDEuIEV2ZXJ5dGhpbmcKKyAgICAgICsgIiAgLyogICAgICAgICAgICAgICAgICAgIiAvLyBFeGNlc3Mgc2xhc2hlcworICAgICAgKyAiICAoICAgICAgICAgICAgICAgICAgICAiIC8vIDIuIFJlcG8gbmFtZQorICAgICAgKyAiICAgLyAgICAgICAgICAgICAgICAgICAiIC8vIExlYWRpbmcgc2xhc2gKKyAgICAgICsgIiAgICg/Oi4oPyEgICAgICAgICAgICAgIiAvLyBBbnl0aGluZywgYXMgbG9uZyBhcyBpdCdzIG5vdCBmb2xsb3dlZCBieS4uLgorICAgICAgKyAiICAgICAgICAvIiArIENNRCArICIvICAiIC8vIHRoZSBzcGVjaWFsICIvPENNRD4vIiBzZXBhcmF0b3IsCisgICAgICArICIgICAgICAgIHwvIiArIENNRCArICIkICIgLy8gb3IgIi88Q01EPiIgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICArICIgICAgICAgICkpKj8gICAgICAgICAgICIKKyAgICAgICsgIiAgKSAgICAgICAgICAgICAgICAgICAgIgorICAgICAgKyAiICAvKiAgICAgICAgICAgICAgICAgICAiIC8vIFRyYWlsaW5nIHNsYXNoZXMKKyAgICAgICsgIiAgKCkgICAgICAgICAgICAgICAgICAgIiAvLyAzLiBDb21tYW5kCisgICAgICArICIgICgpICAgICAgICAgICAgICAgICAgICIgLy8gNC4gUGF0aAorICAgICAgKyAiKSQgICAgICAgICAgICAgICAgICAgICAiLAorICAgICAgUGF0dGVybi5DT01NRU5UUyk7CisKKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJFUE9fUEFUSF9SRUdFWCA9IFBhdHRlcm4uY29tcGlsZSgiIgorICAgICAgKyAiXiggICAgICAgICAgICAgICIgLy8gMS4gRXZlcnl0aGluZworICAgICAgKyAiICAvKiAgICAgICAgICAgICIgLy8gRXhjZXNzIHNsYXNoZXMKKyAgICAgICsgIiAgKCAgICAgICAgICAgICAiIC8vIDIuIFJlcG8gbmFtZQorICAgICAgKyAiICAgLyAgICAgICAgICAgICIgLy8gTGVhZGluZyBzbGFzaAorICAgICAgKyAiICAgLio/ICAgICAgICAgICIgLy8gQW55dGhpbmcsIG5vbi1ncmVlZHkKKyAgICAgICsgIiAgKSAgICAgICAgICAgICAiCisgICAgICArICIgIC8oIiArIENNRCArICIpIiAvLyAzLiBDb21tYW5kCisgICAgICArICIgICggICAgICAgICAgICAgIiAvLyA0LiBQYXRoCisgICAgICArICIgICAoPzovLiopPyAgICAgIiAvLyBTbGFzaCBwYXRoLCBvciBub3RoaW5nLgorICAgICAgKyAiICApICAgICAgICAgICAgICIKKyAgICAgICsgIikkICAgICAgICAgICAgICAiLAorICAgICAgUGF0dGVybi5DT01NRU5UUyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlzcGF0Y2hGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0dHBGaWx0ZXIgeworICAgIHByaXZhdGUgZmluYWwgTGlzdE11bHRpbWFwPEdpdGlsZXNWaWV3LlR5cGUsIEZpbHRlcj4gZmlsdGVyczsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxHaXRpbGVzVmlldy5UeXBlLCBIdHRwU2VydmxldD4gc2VydmxldHM7CisKKyAgICBwcml2YXRlIERpc3BhdGNoRmlsdGVyKExpc3RNdWx0aW1hcDxHaXRpbGVzVmlldy5UeXBlLCBGaWx0ZXI+IGZpbHRlcnMsCisgICAgICAgIE1hcDxHaXRpbGVzVmlldy5UeXBlLCBIdHRwU2VydmxldD4gc2VydmxldHMpIHsKKyAgICAgIHRoaXMuZmlsdGVycyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoZmlsdGVycyk7CisgICAgICB0aGlzLnNlcnZsZXRzID0gSW1tdXRhYmxlTWFwLmNvcHlPZihzZXJ2bGV0cyk7CisgICAgICBmb3IgKEdpdGlsZXNWaWV3LlR5cGUgdHlwZSA6IEdpdGlsZXNWaWV3LlR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgY2hlY2tTdGF0ZShzZXJ2bGV0cy5jb250YWluc0tleSh0eXBlKSwgIk1pc3NpbmcgaGFuZGxlciBmb3IgdmlldyAlcyIsIHR5cGUpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBjaGVja05vdE51bGwoVmlld0ZpbHRlci5nZXRWaWV3KHJlcSkpOworICAgICAgZmluYWwgSXRlcmF0b3I8RmlsdGVyPiBpdHIgPSBmaWx0ZXJzLmdldCh2aWV3LmdldFR5cGUoKSkuaXRlcmF0b3IoKTsKKyAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQgPSBzZXJ2bGV0cy5nZXQodmlldy5nZXRUeXBlKCkpOworICAgICAgbmV3IEZpbHRlckNoYWluKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxLCBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgICBpZiAoaXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgaXRyLm5leHQoKS5kb0ZpbHRlcihyZXEsIHJlcywgdGhpcyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlcnZsZXQuc2VydmljZShyZXEsIHJlcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LmRvRmlsdGVyKHJlcSwgcmVzKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIExpc3RNdWx0aW1hcDxHaXRpbGVzVmlldy5UeXBlLCBGaWx0ZXI+IGZpbHRlcnMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgIHByaXZhdGUgZmluYWwgTWFwPEdpdGlsZXNWaWV3LlR5cGUsIEh0dHBTZXJ2bGV0PiBzZXJ2bGV0cyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIHByaXZhdGUgUmVuZGVyZXIgcmVuZGVyZXI7CisgIHByaXZhdGUgR2l0aWxlc1VybHMgdXJsczsKKyAgcHJpdmF0ZSBMaW5raWZpZXIgbGlua2lmaWVyOworICBwcml2YXRlIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5OworICBwcml2YXRlIFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyOworICBwcml2YXRlIFZpc2liaWxpdHlDYWNoZSB2aXNpYmlsaXR5Q2FjaGU7CisgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKKworICBHaXRpbGVzRmlsdGVyKCkgeworICB9CisKKyAgR2l0aWxlc0ZpbHRlcigKKyAgICAgIFJlbmRlcmVyIHJlbmRlcmVyLAorICAgICAgR2l0aWxlc1VybHMgdXJscywKKyAgICAgIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5LAorICAgICAgZmluYWwgUmVwb3NpdG9yeVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXIsCisgICAgICBWaXNpYmlsaXR5Q2FjaGUgdmlzaWJpbGl0eUNhY2hlKSB7CisgICAgdGhpcy5yZW5kZXJlciA9IGNoZWNrTm90TnVsbChyZW5kZXJlciwgInJlbmRlcmVyIik7CisgICAgdGhpcy51cmxzID0gY2hlY2tOb3ROdWxsKHVybHMsICJ1cmxzIik7CisgICAgdGhpcy5hY2Nlc3NGYWN0b3J5ID0gY2hlY2tOb3ROdWxsKGFjY2Vzc0ZhY3RvcnksICJhY2Nlc3NGYWN0b3J5Iik7CisgICAgdGhpcy52aXNpYmlsaXR5Q2FjaGUgPSBjaGVja05vdE51bGwodmlzaWJpbGl0eUNhY2hlLCAidmlzaWJpbGl0eUNhY2hlIik7CisgICAgdGhpcy5saW5raWZpZXIgPSBuZXcgTGlua2lmaWVyKHVybHMpOworICAgIHRoaXMucmVzb2x2ZXIgPSB3cmFwUmVzb2x2ZXIocmVzb2x2ZXIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBzdXBlci5pbml0KGNvbmZpZyk7CisgICAgc2V0RGVmYXVsdEZpZWxkcyhjb25maWcpOworCisgICAgZm9yIChHaXRpbGVzVmlldy5UeXBlIHR5cGUgOiBHaXRpbGVzVmlldy5UeXBlLnZhbHVlcygpKSB7CisgICAgICBpZiAoIXNlcnZsZXRzLmNvbnRhaW5zS2V5KHR5cGUpKSB7CisgICAgICAgIHNlcnZsZXRzLnB1dCh0eXBlLCBnZXREZWZhdWx0SGFuZGxlcih0eXBlKSk7CisgICAgICB9CisgICAgfQorCisgICAgRmlsdGVyIHJlcG9zaXRvcnlGaWx0ZXIgPSBuZXcgUmVwb3NpdG9yeUZpbHRlcihyZXNvbHZlcik7CisgICAgRmlsdGVyIHZpZXdGaWx0ZXIgPSBuZXcgVmlld0ZpbHRlcihhY2Nlc3NGYWN0b3J5LCB1cmxzLCB2aXNpYmlsaXR5Q2FjaGUpOworICAgIEZpbHRlciBkaXNwYXRjaEZpbHRlciA9IG5ldyBEaXNwYXRjaEZpbHRlcihmaWx0ZXJzLCBzZXJ2bGV0cyk7CisgICAgU3RyaW5nIGJyb3dzZXJDc3NOYW1lOworICAgIFN0cmluZyBwcmV0dGlmeUNzc05hbWU7CisgICAgU3RyaW5nIHByZXR0aWZ5SnNOYW1lOworCisgICAgc2VydmVSZWdleChST09UX1JFR0VYKQorICAgICAgICAudGhyb3VnaCh2aWV3RmlsdGVyKQorICAgICAgICAudGhyb3VnaChkaXNwYXRjaEZpbHRlcik7CisKKyAgICBzZXJ2ZVJlZ2V4KFJFUE9fUkVHRVgpCisgICAgICAgIC50aHJvdWdoKHJlcG9zaXRvcnlGaWx0ZXIpCisgICAgICAgIC50aHJvdWdoKHZpZXdGaWx0ZXIpCisgICAgICAgIC50aHJvdWdoKGRpc3BhdGNoRmlsdGVyKTsKKworICAgIHNlcnZlUmVnZXgoUkVQT19QQVRIX1JFR0VYKQorICAgICAgICAudGhyb3VnaChyZXBvc2l0b3J5RmlsdGVyKQorICAgICAgICAudGhyb3VnaCh2aWV3RmlsdGVyKQorICAgICAgICAudGhyb3VnaChkaXNwYXRjaEZpbHRlcik7CisKKyAgICBpbml0aWFsaXplZCA9IHRydWU7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIEJhc2VTZXJ2bGV0IGdldERlZmF1bHRIYW5kbGVyKEdpdGlsZXNWaWV3LlR5cGUgdmlldykgeworICAgIGNoZWNrTm90SW5pdGlhbGl6ZWQoKTsKKyAgICBzd2l0Y2ggKHZpZXcpIHsKKyAgICAgIGNhc2UgSE9TVF9JTkRFWDoKKyAgICAgICAgcmV0dXJuIG5ldyBIb3N0SW5kZXhTZXJ2bGV0KHJlbmRlcmVyLCB1cmxzLCBhY2Nlc3NGYWN0b3J5KTsKKyAgICAgIGNhc2UgUkVQT1NJVE9SWV9JTkRFWDoKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBvc2l0b3J5SW5kZXhTZXJ2bGV0KHJlbmRlcmVyLCBhY2Nlc3NGYWN0b3J5KTsKKyAgICAgIGNhc2UgUkVWSVNJT046CisgICAgICAgIHJldHVybiBuZXcgUmV2aXNpb25TZXJ2bGV0KHJlbmRlcmVyLCBsaW5raWZpZXIpOworICAgICAgY2FzZSBQQVRIOgorICAgICAgICByZXR1cm4gbmV3IFBhdGhTZXJ2bGV0KHJlbmRlcmVyKTsKKyAgICAgIGNhc2UgRElGRjoKKyAgICAgICAgcmV0dXJuIG5ldyBEaWZmU2VydmxldChyZW5kZXJlciwgbGlua2lmaWVyKTsKKyAgICAgIGNhc2UgTE9HOgorICAgICAgICByZXR1cm4gbmV3IExvZ1NlcnZsZXQocmVuZGVyZXIsIGxpbmtpZmllcik7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHZpZXcgdHlwZTogIiArIHZpZXcpOworICAgIH0KKyAgfQorCisgIHN5bmNocm9uaXplZCB2b2lkIGFkZEZpbHRlcihHaXRpbGVzVmlldy5UeXBlIHZpZXcsIEZpbHRlciBmaWx0ZXIpIHsKKyAgICBjaGVja05vdEluaXRpYWxpemVkKCk7CisgICAgZmlsdGVycy5wdXQoY2hlY2tOb3ROdWxsKHZpZXcsICJ2aWV3IiksIGNoZWNrTm90TnVsbChmaWx0ZXIsICJmaWx0ZXIgZm9yICVzIiwgdmlldykpOworICB9CisKKyAgc3luY2hyb25pemVkIHZvaWQgc2V0SGFuZGxlcihHaXRpbGVzVmlldy5UeXBlIHZpZXcsIEh0dHBTZXJ2bGV0IGhhbmRsZXIpIHsKKyAgICBjaGVja05vdEluaXRpYWxpemVkKCk7CisgICAgc2VydmxldHMucHV0KGNoZWNrTm90TnVsbCh2aWV3LCAidmlldyIpLAorICAgICAgICBjaGVja05vdE51bGwoaGFuZGxlciwgImhhbmRsZXIgZm9yICVzIiwgdmlldykpOworICB9CisKKyAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjaGVja05vdEluaXRpYWxpemVkKCkgeworICAgIGNoZWNrU3RhdGUoIWluaXRpYWxpemVkLCAiR2l0aWxlcyBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiB3cmFwUmVzb2x2ZXIoCisgICAgICBmaW5hbCBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcikgeworICAgIGNoZWNrTm90TnVsbChyZXNvbHZlciwgInJlc29sdmVyIik7CisgICAgcmV0dXJuIG5ldyBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJlcG9zaXRvcnkgb3BlbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgbmFtZSkKKyAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiwKKyAgICAgICAgICBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVyLm9wZW4ocmVxLCBWaWV3RmlsdGVyLnRyaW1MZWFkaW5nU2xhc2goZ2V0UmVnZXhHcm91cChyZXEsIDEpKSk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0RmllbGRzKEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBpZiAocmVuZGVyZXIgIT0gbnVsbCAmJiB1cmxzICE9IG51bGwgJiYgYWNjZXNzRmFjdG9yeSAhPSBudWxsICYmIHJlc29sdmVyICE9IG51bGwKKyAgICAgICAgJiYgdmlzaWJpbGl0eUNhY2hlICE9IG51bGwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgU3RyaW5nIGNvbmZpZ1BhdGggPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihDT05GSUdfUEFUSF9QQVJBTSk7CisgICAgaWYgKGNvbmZpZ1BhdGggPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIk1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICIgKyBjb25maWdQYXRoKTsKKyAgICB9CisgICAgRmlsZUJhc2VkQ29uZmlnIGpnaXRDb25maWcgPSBuZXcgRmlsZUJhc2VkQ29uZmlnKG5ldyBGaWxlKGNvbmZpZ1BhdGgpLCBGUy5ERVRFQ1RFRCk7CisgICAgdHJ5IHsKKyAgICAgIGpnaXRDb25maWcubG9hZCgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgfQorCisgICAgaWYgKHJlbmRlcmVyID09IG51bGwpIHsKKyAgICAgIFN0cmluZyBzdGF0aWNQcmVmaXggPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRDb250ZXh0UGF0aCgpICsgU1RBVElDX1BSRUZJWDsKKyAgICAgIFN0cmluZyBjdXN0b21UZW1wbGF0ZXMgPSBqZ2l0Q29uZmlnLmdldFN0cmluZygiZ2l0aWxlcyIsIG51bGwsICJjdXN0b21UZW1wbGF0ZXMiKTsKKyAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogQXV0b21hdGljYWxseSBzZXQgdG8gdHJ1ZSB3aGVuIHJ1biB3aXRoIG12biBqZXR0eTpydW4uCisgICAgICBpZiAoamdpdENvbmZpZy5nZXRCb29sZWFuKCJnaXRpbGVzIiwgbnVsbCwgInJlbG9hZFRlbXBsYXRlcyIsIGZhbHNlKSkgeworICAgICAgICByZW5kZXJlciA9IG5ldyBEZWJ1Z1JlbmRlcmVyKHN0YXRpY1ByZWZpeCwgY3VzdG9tVGVtcGxhdGVzLAorICAgICAgICAgICAgSm9pbmVyLm9uKEZpbGUuc2VwYXJhdG9yQ2hhcikuam9pbihTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksCisgICAgICAgICAgICAgICAgImdpdGlsZXMtc2VydmxldCIsICJzcmMiLCAibWFpbiIsICJyZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICJjb20iLCAiZ29vZ2xlIiwgImdpdGlsZXMiLCAidGVtcGxhdGVzIikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyZXIgPSBuZXcgRGVmYXVsdFJlbmRlcmVyKHN0YXRpY1ByZWZpeCwgUmVuZGVyZXIudG9GaWxlVVJMKGN1c3RvbVRlbXBsYXRlcykpOworICAgICAgfQorICAgIH0KKyAgICBpZiAodXJscyA9PSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICB1cmxzID0gbmV3IERlZmF1bHRVcmxzKAorICAgICAgICAgICAgamdpdENvbmZpZy5nZXRTdHJpbmcoImdpdGlsZXMiLCBudWxsLCAiY2Fub25pY2FsSG9zdE5hbWUiKSwKKyAgICAgICAgICAgIGdldEJhc2VHaXRVcmwoamdpdENvbmZpZyksCisgICAgICAgICAgICBnZXRHZXJyaXRVcmwoamdpdENvbmZpZykpOworICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGlua2lmaWVyID0gbmV3IExpbmtpZmllcih1cmxzKTsKKyAgICBpZiAoYWNjZXNzRmFjdG9yeSA9PSBudWxsIHx8IHJlc29sdmVyID09IG51bGwpIHsKKyAgICAgIFN0cmluZyBiYXNlUGF0aCA9IGpnaXRDb25maWcuZ2V0U3RyaW5nKCJnaXRpbGVzIiwgbnVsbCwgImJhc2VQYXRoIik7CisgICAgICBpZiAoYmFzZVBhdGggPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiZ2l0aWxlcy5iYXNlUGF0aCBub3Qgc2V0Iik7CisgICAgICB9CisgICAgICBib29sZWFuIGV4cG9ydEFsbCA9IGpnaXRDb25maWcuZ2V0Qm9vbGVhbigiZ2l0aWxlcyIsIG51bGwsICJleHBvcnRBbGwiLCBmYWxzZSk7CisKKyAgICAgIEZpbGVSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IGZpbGVSZXNvbHZlcjsKKyAgICAgIGlmIChyZXNvbHZlciA9PSBudWxsKSB7CisgICAgICAgIGZpbGVSZXNvbHZlciA9IG5ldyBGaWxlUmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PihuZXcgRmlsZShiYXNlUGF0aCksIGV4cG9ydEFsbCk7CisgICAgICAgIHJlc29sdmVyID0gd3JhcFJlc29sdmVyKGZpbGVSZXNvbHZlcik7CisgICAgICB9IGVsc2UgaWYgKHJlc29sdmVyIGluc3RhbmNlb2YgRmlsZVJlc29sdmVyKSB7CisgICAgICAgIGZpbGVSZXNvbHZlciA9IChGaWxlUmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PikgcmVzb2x2ZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWxlUmVzb2x2ZXIgPSBudWxsOworICAgICAgfQorICAgICAgaWYgKGFjY2Vzc0ZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICBjaGVja1N0YXRlKGZpbGVSZXNvbHZlciAhPSBudWxsLCAibmVlZCBhIEZpbGVSZXNvbHZlciB3aGVuIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBub3Qgc2V0Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgIGFjY2Vzc0ZhY3RvcnkgPSBuZXcgRGVmYXVsdEFjY2Vzcy5GYWN0b3J5KAorICAgICAgICAgICAgbmV3IEZpbGUoYmFzZVBhdGgpLAorICAgICAgICAgICAgZ2V0QmFzZUdpdFVybChqZ2l0Q29uZmlnKSwKKyAgICAgICAgICAgIGZpbGVSZXNvbHZlcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAodmlzaWJpbGl0eUNhY2hlID09IG51bGwpIHsKKyAgICAgIGlmIChqZ2l0Q29uZmlnLmdldFN1YnNlY3Rpb25zKCJjYWNoZSIpLmNvbnRhaW5zKCJ2aXNpYmlsaXR5IikpIHsKKyAgICAgICAgdmlzaWJpbGl0eUNhY2hlID0KKyAgICAgICAgICAgIG5ldyBWaXNpYmlsaXR5Q2FjaGUoZmFsc2UsIENvbmZpZ1V0aWwuZ2V0Q2FjaGVCdWlsZGVyKGpnaXRDb25maWcsICJ2aXNpYmlsaXR5IikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmlzaWJpbGl0eUNhY2hlID0gbmV3IFZpc2liaWxpdHlDYWNoZShmYWxzZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEJhc2VHaXRVcmwoQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIFN0cmluZyBiYXNlR2l0VXJsID0gY29uZmlnLmdldFN0cmluZygiZ2l0aWxlcyIsIG51bGwsICJiYXNlR2l0VXJsIik7CisgICAgaWYgKGJhc2VHaXRVcmwgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oImdpdGlsZXMuYmFzZUdpdFVybCBub3Qgc2V0Iik7CisgICAgfQorICAgIHJldHVybiBiYXNlR2l0VXJsOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEdlcnJpdFVybChDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGdlcnJpdFVybCA9IGNvbmZpZy5nZXRTdHJpbmcoImdpdGlsZXMiLCBudWxsLCAiZ2Vycml0VXJsIik7CisgICAgaWYgKGdlcnJpdFVybCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiZ2l0aWxlcy5nZXJyaXRVcmwgbm90IHNldCIpOworICAgIH0KKyAgICByZXR1cm4gZ2Vycml0VXJsOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1NlcnZsZXQuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGJjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWUuTWV0YVNlcnZsZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuUmVwb3NpdG9yeVJlc29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioKKyAqIFNlcnZsZXQgdG8gc2VydmUgR2l0aWxlcy4KKyAqIDxwPgorICogVGhpcyBzZXJ2bGV0IGNhbiBlaXRoZXIgYmUgY29uc3RydWN0ZWQgbWFudWFsbHkgd2l0aCBpdHMgZGVwZW5kZW5jaWVzLCBvcgorICogY29uZmlndXJlZCB0byB1c2UgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBHaXRpbGVzIGludGVyZmFjZXMuIFRvCisgKiBjb25maWd1cmUgdGhlIGRlZmF1bHRzLCB5b3UgbXVzdCBwcm92aWRlIGEgc2luZ2xlIGluaXQgcGFyYW1ldGVyCisgKiAiY29uZmlnUGF0aCIsIHdoaWNoIGlzIHRoZSBwYXRoIHRvIGEgZ2l0IGNvbmZpZyBmaWxlIGNvbnRhaW5pbmcgYWRkaXRpb25hbAorICogY29uZmlndXJhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEdpdGlsZXNTZXJ2bGV0IGV4dGVuZHMgTWV0YVNlcnZsZXQgeworICAvKiogVGhlIHByZWZpeCBmcm9tIHdoaWNoIHN0YXRpYyByZXNvdXJjZXMgYXJlIHNlcnZlZC4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1BSRUZJWCA9ICIvK3N0YXRpYy8iOworCisgIHB1YmxpYyBHaXRpbGVzU2VydmxldChSZW5kZXJlciByZW5kZXJlciwKKyAgICAgIEdpdGlsZXNVcmxzIHVybHMsCisgICAgICBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeSwKKyAgICAgIFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyLAorICAgICAgVmlzaWJpbGl0eUNhY2hlIHZpc2liaWxpdHlDYWNoZSkgeworICAgIHN1cGVyKG5ldyBHaXRpbGVzRmlsdGVyKHJlbmRlcmVyLCB1cmxzLCBhY2Nlc3NGYWN0b3J5LCByZXNvbHZlciwgdmlzaWJpbGl0eUNhY2hlKSk7CisgIH0KKworICBwdWJsaWMgR2l0aWxlc1NlcnZsZXQoKSB7CisgICAgc3VwZXIobmV3IEdpdGlsZXNGaWx0ZXIoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIEdpdGlsZXNGaWx0ZXIgZ2V0RGVsZWdhdGVGaWx0ZXIoKSB7CisgICAgcmV0dXJuIChHaXRpbGVzRmlsdGVyKSBzdXBlci5nZXREZWxlZ2F0ZUZpbHRlcigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXQoZmluYWwgU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICBnZXREZWxlZ2F0ZUZpbHRlcigpLmluaXQobmV3IEZpbHRlckNvbmZpZygpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGVGaWx0ZXIoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKG5hbWUpOworICAgICAgfQorCisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICByZXR1cm4gY29uZmlnLmdldEluaXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgLyoqCisgICAqIEFkZCBhIGN1c3RvbSBmaWx0ZXIgZm9yIGEgdmlldy4KKyAgICogPHA+CisgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIHNlcnZsZXQuCisgICAqCisgICAqIEBwYXJhbSB2aWV3IHZpZXcgdHlwZS4KKyAgICogQHBhcmFtIGZpbHRlciBmaWx0ZXIuCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoR2l0aWxlc1ZpZXcuVHlwZSB2aWV3LCBGaWx0ZXIgZmlsdGVyKSB7CisgICAgZ2V0RGVsZWdhdGVGaWx0ZXIoKS5hZGRGaWx0ZXIodmlldywgZmlsdGVyKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgYSBjdXN0b20gaGFuZGxlciBmb3IgYSB2aWV3LgorICAgKiA8cD4KKyAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgc2VydmxldC4KKyAgICoKKyAgICogQHBhcmFtIHZpZXcgdmlldyB0eXBlLgorICAgKiBAcGFyYW0gaGFuZGxlciBoYW5kbGVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihHaXRpbGVzVmlldy5UeXBlIHZpZXcsIEh0dHBTZXJ2bGV0IGhhbmRsZXIpIHsKKyAgICBnZXREZWxlZ2F0ZUZpbHRlcigpLnNldEhhbmRsZXIodmlldywgaGFuZGxlcik7CisgIH0KKworICBwdWJsaWMgQmFzZVNlcnZsZXQgZ2V0RGVmYXVsdEhhbmRsZXIoR2l0aWxlc1ZpZXcuVHlwZSB2aWV3KSB7CisgICAgcmV0dXJuIGdldERlbGVnYXRlRmlsdGVyKCkuZ2V0RGVmYXVsdEhhbmRsZXIodmlldyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVXJscy5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNVcmxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3ZmYzYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVXJscy5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKiogSW50ZXJmYWNlIGZvciBVUkxzIGRpc3BsYXllZCBvbiBzb3VyY2UgYnJvd3NpbmcgcGFnZXMuICovCitwdWJsaWMgaW50ZXJmYWNlIEdpdGlsZXNVcmxzIHsKKyAgLyoqCisgICAqIEVzY2FwZXMgcmVwb3NpdG9yeSBvciBwYXRoIG5hbWVzIHRvIGJlIHNhZmVseSBlbWJlZGRlZCBpbnRvIGEgVVJMLgorICAgKiA8cD4KKyAgICogVGhpcyBlc2NhcGUgaW1wbGVtZW50YXRpb24gZXNjYXBlcyBhIHJlcG9zaXRvcnkgb3IgcGF0aCBuYW1lIHN1Y2ggYXMKKyAgICogImZvby9iYXI8L2NoaWxkIiB0byBhcHBlYXIgYXMgImZvby9iYXIlM0MvY2hpbGQiLiBTcGFjZXMgYXJlIGVzY2FwZWQgYXMKKyAgICogIiUyMCIuIEl0cyBwdXJwb3NlIGlzIHRvIGVzY2FwZSBhIHJlcG9zaXRvcnkgbmFtZSB0byBiZSBzYWZlIGZvciBpbmNsdXNpb24KKyAgICogaW4gdGhlIHBhdGggY29tcG9uZW50IG9mIHRoZSBVUkwsIHdoZXJlICIvIiBpcyBhIHZhbGlkIGNoYXJhY3RlciB0aGF0CisgICAqIHNob3VsZCBub3QgYmUgZW5jb2RlZCwgd2hpbGUgYWxtb3N0IGFueSBvdGhlciBub24tYWxwaGEsIG5vbi1udW1lcmljCisgICAqIGNoYXJhY3RlciB3aWxsIGJlIGVuY29kZWQgdXNpbmcgVVJMIHN0eWxlIGVuY29kaW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4gTkFNRV9FU0NBUEVSID0gbmV3IEZ1bmN0aW9uPFN0cmluZywgU3RyaW5nPigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KFN0cmluZyBzKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gVVJMRW5jb2Rlci5lbmNvZGUocywgQ2hhcnNldHMuVVRGXzgubmFtZSgpKQorICAgICAgICAgICAgLnJlcGxhY2UoIiUyRiIsICIvIikKKyAgICAgICAgICAgIC5yZXBsYWNlKCIlMmYiLCAiLyIpCisgICAgICAgICAgICAucmVwbGFjZSgiKyIsICIlMjAiKQorICAgICAgICAgICAgLnJlcGxhY2UoIiUyQiIsICIrIikKKyAgICAgICAgICAgIC5yZXBsYWNlKCIlMmIiLCAiKyIpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGhvc3QgZnJvbSB0aGUgcmVxdWVzdC4KKyAgICoKKyAgICogVXNlZCBpbiB2YXJpb3VzIHVzZXItdmlzaWJsZSB0ZXh0LCBsaWtlICJNeUhvc3QgR2l0IFJlcG9zaXRvcmllcyIuCisgICAqCisgICAqIEBwYXJhbSByZXEgcmVxdWVzdC4KKyAgICogQHJldHVybiBob3N0IG5hbWU7IG1heSBiZSBudWxsLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZShIdHRwU2VydmxldFJlcXVlc3QgcmVxKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBiYXNlIFVSTCBmb3IgZ2l0IHJlcG9zaXRvcmllcyBvbiB0aGlzIGhvc3QuCisgICAqCisgICAqIEBwYXJhbSByZXEgcmVxdWVzdC4KKyAgICogQHJldHVybiBiYXNlIFVSTCBmb3IgZ2l0IHJlcG9zaXRvcmllcy4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUdpdFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBiYXNlIFVSTCBmb3IgR2Vycml0IHByb2plY3RzIG9uIHRoaXMgaG9zdC4KKyAgICoKKyAgICogQHBhcmFtIHJlcSByZXF1ZXN0LgorICAgKiBAcmV0dXJuIGJhc2UgVVJMIGZvciBHZXJyaXQgQ29kZSBSZXZpZXcsIG9yIG51bGwgaWYgR2Vycml0IGlzIG5vdAorICAgKiAgICAgY29uZmlndXJlZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUdlcnJpdFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxKTsKK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVmlldy5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2ODVjNAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9HaXRpbGVzVmlldy5qYXZhCkBAIC0wLDAgKzEsNTYzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNVcmxzLk5BTUVfRVNDQVBFUjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2T2JqZWN0OworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgYSB2aWV3IGluIEdpdGlsZXMuCisgKiA8cD4KKyAqIFZpZXdzIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGEgdHlwZSwgYW5kIGRpc3BhdGNoZWQgdG8gc2VydmxldCB0eXBlcyBieQorICoge0BsaW5rIEdpdGlsZXNTZXJ2bGV0fS4gVGhpcyBjbGFzcyBjb250YWlucyB0aGUgbGlzdCBvZiBhbGwgdHlwZXMsIGFzCisgKiB3ZWxsIGFzIHNvbWUgbWV0aG9kcyBjb250YWluaW5nIGJhc2ljIGluZm9ybWF0aW9uIHBhcnNlZCBmcm9tIHRoZSBVUkwuCisgKiBDb25zdHJ1Y3Rpb24gaGFwcGVucyBpbiB7QGxpbmsgVmlld0ZpbHRlcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBHaXRpbGVzVmlldyB7CisgIC8qKiBBbGwgdGhlIHBvc3NpYmxlIHZpZXcgdHlwZXMgc3VwcG9ydGVkIGluIHRoZSBhcHBsaWNhdGlvbi4gKi8KKyAgcHVibGljIHN0YXRpYyBlbnVtIFR5cGUgeworICAgIEhPU1RfSU5ERVgsCisgICAgUkVQT1NJVE9SWV9JTkRFWCwKKyAgICBSRVZJU0lPTiwKKyAgICBQQVRILAorICAgIERJRkYsCisgICAgTE9HOworICB9CisKKyAgLyoqIEJ1aWxkZXIgZm9yIHZpZXdzLiAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworICAgIHByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworICAgIHByaXZhdGUgZmluYWwgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisKKyAgICBwcml2YXRlIFN0cmluZyBob3N0TmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2bGV0UGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyByZXBvc2l0b3J5TmFtZTsKKyAgICBwcml2YXRlIFJldmlzaW9uIHJldmlzaW9uID0gUmV2aXNpb24uTlVMTDsKKyAgICBwcml2YXRlIFJldmlzaW9uIG9sZFJldmlzaW9uID0gUmV2aXNpb24uTlVMTDsKKyAgICBwcml2YXRlIFN0cmluZyBwYXRoOworICAgIHByaXZhdGUgU3RyaW5nIGFuY2hvcjsKKworICAgIHByaXZhdGUgQnVpbGRlcihUeXBlIHR5cGUpIHsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgY29weUZyb20oR2l0aWxlc1ZpZXcgb3RoZXIpIHsKKyAgICAgIGhvc3ROYW1lID0gb3RoZXIuaG9zdE5hbWU7CisgICAgICBzZXJ2bGV0UGF0aCA9IG90aGVyLnNlcnZsZXRQYXRoOworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTE9HOgorICAgICAgICBjYXNlIERJRkY6CisgICAgICAgICAgb2xkUmV2aXNpb24gPSBvdGhlci5vbGRSZXZpc2lvbjsKKyAgICAgICAgICAvLyBGYWxsdGhyb3VnaC4KKyAgICAgICAgY2FzZSBQQVRIOgorICAgICAgICAgIHBhdGggPSBvdGhlci5wYXRoOworICAgICAgICAgIC8vIEZhbGx0aHJvdWdoLgorICAgICAgICBjYXNlIFJFVklTSU9OOgorICAgICAgICAgIHJldmlzaW9uID0gb3RoZXIucmV2aXNpb247CisgICAgICAgICAgLy8gRmFsbHRocm91Z2guCisgICAgICAgIGNhc2UgUkVQT1NJVE9SWV9JTkRFWDoKKyAgICAgICAgICByZXBvc2l0b3J5TmFtZSA9IG90aGVyLnJlcG9zaXRvcnlOYW1lOworICAgICAgfQorICAgICAgLy8gRG9uJ3QgY29weSBwYXJhbXMuCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBjb3B5RnJvbShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgICByZXR1cm4gY29weUZyb20oVmlld0ZpbHRlci5nZXRWaWV3KHJlcSkpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldEhvc3ROYW1lKFN0cmluZyBob3N0TmFtZSkgeworICAgICAgdGhpcy5ob3N0TmFtZSA9IGNoZWNrTm90TnVsbChob3N0TmFtZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3ROYW1lKCkgeworICAgICAgcmV0dXJuIGhvc3ROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFNlcnZsZXRQYXRoKFN0cmluZyBzZXJ2bGV0UGF0aCkgeworICAgICAgdGhpcy5zZXJ2bGV0UGF0aCA9IGNoZWNrTm90TnVsbChzZXJ2bGV0UGF0aCk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCkgeworICAgICAgcmV0dXJuIHNlcnZsZXRQYXRoOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFJlcG9zaXRvcnlOYW1lKFN0cmluZyByZXBvc2l0b3J5TmFtZSkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgSE9TVF9JTkRFWDoKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJjYW5ub3Qgc2V0IHJlcG9zaXRvcnkgbmFtZSBvbiAlcyB2aWV3IiwgdHlwZSkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRoaXMucmVwb3NpdG9yeU5hbWUgPSBjaGVja05vdE51bGwocmVwb3NpdG9yeU5hbWUpOworICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeU5hbWUoKSB7CisgICAgICByZXR1cm4gcmVwb3NpdG9yeU5hbWU7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgc2V0UmV2aXNpb24oUmV2aXNpb24gcmV2aXNpb24pIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEhPU1RfSU5ERVg6CisgICAgICAgIGNhc2UgUkVQT1NJVE9SWV9JTkRFWDoKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoImNhbm5vdCBzZXQgcmV2aXNpb24gb24gJXMgdmlldyIsIHR5cGUpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aGlzLnJldmlzaW9uID0gY2hlY2tOb3ROdWxsKHJldmlzaW9uKTsKKyAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXZpc2lvbihTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIHNldFJldmlzaW9uKFJldmlzaW9uLm5hbWVkKG5hbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXZpc2lvbihSZXZPYmplY3Qgb2JqKSB7CisgICAgICByZXR1cm4gc2V0UmV2aXNpb24oUmV2aXNpb24ucGVlbGVkKG9iai5uYW1lKCksIG9iaikpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFJldmlzaW9uKFN0cmluZyBuYW1lLCBSZXZPYmplY3Qgb2JqKSB7CisgICAgICByZXR1cm4gc2V0UmV2aXNpb24oUmV2aXNpb24ucGVlbGVkKG5hbWUsIG9iaikpOworICAgIH0KKworICAgIHB1YmxpYyBSZXZpc2lvbiBnZXRSZXZpc2lvbigpIHsKKyAgICAgIHJldHVybiByZXZpc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRPbGRSZXZpc2lvbihSZXZpc2lvbiByZXZpc2lvbikgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRElGRjoKKyAgICAgICAgY2FzZSBMT0c6CisgICAgICAgICAgdGhpcy5vbGRSZXZpc2lvbiA9IGNoZWNrTm90TnVsbChyZXZpc2lvbik7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiY2Fubm90IHNldCBvbGQgcmV2aXNpb24gb24gJXMgdmlldyIsIHR5cGUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRPbGRSZXZpc2lvbihSZXZPYmplY3Qgb2JqKSB7CisgICAgICByZXR1cm4gc2V0T2xkUmV2aXNpb24oUmV2aXNpb24ucGVlbGVkKG9iai5uYW1lKCksIG9iaikpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldE9sZFJldmlzaW9uKFN0cmluZyBuYW1lLCBSZXZPYmplY3Qgb2JqKSB7CisgICAgICByZXR1cm4gc2V0T2xkUmV2aXNpb24oUmV2aXNpb24ucGVlbGVkKG5hbWUsIG9iaikpOworICAgIH0KKworICAgIHB1YmxpYyBSZXZpc2lvbiBnZXRPbGRSZXZpc2lvbigpIHsKKyAgICAgIHJldHVybiByZXZpc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRUcmVlUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgUEFUSDoKKyAgICAgICAgY2FzZSBESUZGOgorICAgICAgICAgIHRoaXMucGF0aCA9IG1heWJlVHJpbUxlYWRpbmdBbmRUcmFpbGluZ1NsYXNoKGNoZWNrTm90TnVsbChwYXRoKSk7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGNhc2UgTE9HOgorICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGggIT0gbnVsbCA/IG1heWJlVHJpbUxlYWRpbmdBbmRUcmFpbGluZ1NsYXNoKHBhdGgpIDogbnVsbDsKKyAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoImNhbm5vdCBzZXQgcGF0aCBvbiAlcyB2aWV3IiwgdHlwZSkpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZVBhdGgoKSB7CisgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBwdXRQYXJhbShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgIHBhcmFtcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciByZXBsYWNlUGFyYW0oU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICBwYXJhbXMucmVwbGFjZVZhbHVlcyhrZXksIEltbXV0YWJsZUxpc3Qub2YodmFsdWUpKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHB1dEFsbFBhcmFtcyhNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1zKSB7CisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZ1tdPiBlIDogcGFyYW1zLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgdiA6IGUuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIHRoaXMucGFyYW1zLnB1dChlLmdldEtleSgpLCB2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1zKCkgeworICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzZXRBbmNob3IoU3RyaW5nIGFuY2hvcikgeworICAgICAgdGhpcy5hbmNob3IgPSBhbmNob3I7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFuY2hvcigpIHsKKyAgICAgIHJldHVybiBhbmNob3I7CisgICAgfQorCisgICAgcHVibGljIEdpdGlsZXNWaWV3IGJ1aWxkKCkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgSE9TVF9JTkRFWDoKKyAgICAgICAgICBjaGVja0hvc3RJbmRleCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFUE9TSVRPUllfSU5ERVg6CisgICAgICAgICAgY2hlY2tSZXBvc2l0b3J5SW5kZXgoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZJU0lPTjoKKyAgICAgICAgICBjaGVja1JldmlzaW9uKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEFUSDoKKyAgICAgICAgICBjaGVja1BhdGgoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESUZGOgorICAgICAgICAgIGNoZWNrRGlmZigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExPRzoKKyAgICAgICAgICBjaGVja0xvZygpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBHaXRpbGVzVmlldyh0eXBlLCBob3N0TmFtZSwgc2VydmxldFBhdGgsIHJlcG9zaXRvcnlOYW1lLCByZXZpc2lvbiwKKyAgICAgICAgICBvbGRSZXZpc2lvbiwgcGF0aCwgcGFyYW1zLCBhbmNob3IpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9VcmwoKSB7CisgICAgICByZXR1cm4gYnVpbGQoKS50b1VybCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0hvc3RJbmRleCgpIHsKKyAgICAgIGNoZWNrU3RhdGUoaG9zdE5hbWUgIT0gbnVsbCwgIm1pc3NpbmcgaG9zdE5hbWUgb24gJXMgdmlldyIsIHR5cGUpOworICAgICAgY2hlY2tTdGF0ZShzZXJ2bGV0UGF0aCAhPSBudWxsLCAibWlzc2luZyBob3N0TmFtZSBvbiAlcyB2aWV3IiwgdHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVwb3NpdG9yeUluZGV4KCkgeworICAgICAgY2hlY2tTdGF0ZShyZXBvc2l0b3J5TmFtZSAhPSBudWxsLCAibWlzc2luZyByZXBvc2l0b3J5IG5hbWUgb24gJXMgdmlldyIsIHR5cGUpOworICAgICAgY2hlY2tIb3N0SW5kZXgoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXZpc2lvbigpIHsKKyAgICAgIGNoZWNrU3RhdGUocmV2aXNpb24gIT0gUmV2aXNpb24uTlVMTCwgIm1pc3NpbmcgcmV2aXNpb24gb24gJXMgdmlldyIsIHR5cGUpOworICAgICAgY2hlY2tSZXBvc2l0b3J5SW5kZXgoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEaWZmKCkgeworICAgICAgY2hlY2tQYXRoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTG9nKCkgeworICAgICAgY2hlY2tSZXZpc2lvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1BhdGgoKSB7CisgICAgICBjaGVja1N0YXRlKHBhdGggIT0gbnVsbCwgIm1pc3NpbmcgcGF0aCBvbiAlcyB2aWV3IiwgdHlwZSk7CisgICAgICBjaGVja1JldmlzaW9uKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGhvc3RJbmRleCgpIHsKKyAgICByZXR1cm4gbmV3IEJ1aWxkZXIoVHlwZS5IT1NUX0lOREVYKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciByZXBvc2l0b3J5SW5kZXgoKSB7CisgICAgcmV0dXJuIG5ldyBCdWlsZGVyKFR5cGUuUkVQT1NJVE9SWV9JTkRFWCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgcmV2aXNpb24oKSB7CisgICAgcmV0dXJuIG5ldyBCdWlsZGVyKFR5cGUuUkVWSVNJT04pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIHBhdGgoKSB7CisgICAgcmV0dXJuIG5ldyBCdWlsZGVyKFR5cGUuUEFUSCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgZGlmZigpIHsKKyAgICByZXR1cm4gbmV3IEJ1aWxkZXIoVHlwZS5ESUZGKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBsb2coKSB7CisgICAgcmV0dXJuIG5ldyBCdWlsZGVyKFR5cGUuTE9HKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYXliZVRyaW1MZWFkaW5nQW5kVHJhaWxpbmdTbGFzaChTdHJpbmcgc3RyKSB7CisgICAgaWYgKHN0ci5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMSk7CisgICAgfQorICAgIHJldHVybiAhc3RyLmlzRW1wdHkoKSAmJiBzdHIuZW5kc1dpdGgoIi8iKSA/IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCgpIC0gMSkgOiBzdHI7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdE5hbWU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlcnZsZXRQYXRoOworICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXBvc2l0b3J5TmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpc2lvbiByZXZpc2lvbjsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpc2lvbiBvbGRSZXZpc2lvbjsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aDsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtczsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYW5jaG9yOworCisgIHByaXZhdGUgR2l0aWxlc1ZpZXcoVHlwZSB0eXBlLAorICAgICAgU3RyaW5nIGhvc3ROYW1lLAorICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoLAorICAgICAgU3RyaW5nIHJlcG9zaXRvcnlOYW1lLAorICAgICAgUmV2aXNpb24gcmV2aXNpb24sCisgICAgICBSZXZpc2lvbiBvbGRSZXZpc2lvbiwKKyAgICAgIFN0cmluZyBwYXRoLAorICAgICAgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMsCisgICAgICBTdHJpbmcgYW5jaG9yKSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLmhvc3ROYW1lID0gaG9zdE5hbWU7CisgICAgdGhpcy5zZXJ2bGV0UGF0aCA9IHNlcnZsZXRQYXRoOworICAgIHRoaXMucmVwb3NpdG9yeU5hbWUgPSByZXBvc2l0b3J5TmFtZTsKKyAgICB0aGlzLnJldmlzaW9uID0gT2JqZWN0cy5maXJzdE5vbk51bGwocmV2aXNpb24sIFJldmlzaW9uLk5VTEwpOworICAgIHRoaXMub2xkUmV2aXNpb24gPSBPYmplY3RzLmZpcnN0Tm9uTnVsbChvbGRSZXZpc2lvbiwgUmV2aXNpb24uTlVMTCk7CisgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB0aGlzLnBhcmFtcyA9IE11bHRpbWFwcy51bm1vZGlmaWFibGVMaXN0TXVsdGltYXAocGFyYW1zKTsKKyAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoKSB7CisgICAgcmV0dXJuIGhvc3ROYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICByZXR1cm4gc2VydmxldFBhdGg7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlOYW1lKCkgeworICAgIHJldHVybiByZXBvc2l0b3J5TmFtZTsKKyAgfQorCisgIHB1YmxpYyBSZXZpc2lvbiBnZXRSZXZpc2lvbigpIHsKKyAgICByZXR1cm4gcmV2aXNpb247CisgIH0KKworICBwdWJsaWMgUmV2aXNpb24gZ2V0T2xkUmV2aXNpb24oKSB7CisgICAgcmV0dXJuIG9sZFJldmlzaW9uOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRSZXZpc2lvblJhbmdlKCkgeworICAgIGlmIChvbGRSZXZpc2lvbiA9PSBSZXZpc2lvbi5OVUxMKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBMT0c6CisgICAgICAgIGNhc2UgRElGRjoKKyAgICAgICAgICAvLyBGb3IgdHlwZXMgdGhhdCByZXF1aXJlIHR3byByZXZpc2lvbnMsIE5VTEwgaW5kaWNhdGVzIHRoZSBlbXB0eQorICAgICAgICAgIC8vIHRyZWUvY29tbWl0LgorICAgICAgICAgIHJldHVybiByZXZpc2lvbi5nZXROYW1lKCkgKyAiXiEiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2UgTlVMTCBpbmRpY2F0ZXMgaXQgaXMgbm90IGEgcmFuZ2UsIGp1c3QgYSBzaW5nbGUKKyAgICAgICAgICAvLyByZXZpc2lvbi4KKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZS5ESUZGICYmIGlzRmlyc3RQYXJlbnQocmV2aXNpb24sIG9sZFJldmlzaW9uKSkgeworICAgICAgcmV0dXJuIHJldmlzaW9uLmdldE5hbWUoKSArICJeISI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBvbGRSZXZpc2lvbi5nZXROYW1lKCkgKyAiLi4iICsgcmV2aXNpb24uZ2V0TmFtZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZVBhdGgoKSB7CisgICAgcmV0dXJuIHBhdGg7CisgIH0KKworICBwdWJsaWMgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiBwYXJhbXM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEFuY2hvcigpIHsKKyAgICByZXR1cm4gYW5jaG9yOworICB9CisKKyAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICByZXR1cm4gdHlwZTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIGFuIGVzY2FwZWQsIHJlbGF0aXZlIFVSTCByZXByZXNlbnRpbmcgdGhpcyB2aWV3LiAqLworICBwdWJsaWMgU3RyaW5nIHRvVXJsKCkgeworICAgIFN0cmluZ0J1aWxkZXIgdXJsID0gbmV3IFN0cmluZ0J1aWxkZXIoc2VydmxldFBhdGgpLmFwcGVuZCgnLycpOworICAgIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gdGhpcy5wYXJhbXM7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIEhPU1RfSU5ERVg6CisgICAgICAgIHBhcmFtcyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5jb250YWluc0tleSgiZm9ybWF0IikpIHsKKyAgICAgICAgICBwYXJhbXMucHV0KCJmb3JtYXQiLCBGb3JtYXRUeXBlLkhUTUwudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1zLnB1dEFsbCh0aGlzLnBhcmFtcyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSRVBPU0lUT1JZX0lOREVYOgorICAgICAgICB1cmwuYXBwZW5kKHJlcG9zaXRvcnlOYW1lKS5hcHBlbmQoJy8nKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJFVklTSU9OOgorICAgICAgICB1cmwuYXBwZW5kKHJlcG9zaXRvcnlOYW1lKS5hcHBlbmQoIi8rIik7CisgICAgICAgIGlmICghZ2V0UmV2aXNpb24oKS5uYW1lSXNJZCgpKSB7CisgICAgICAgICAgdXJsLmFwcGVuZCgic2hvdyIpOyAvLyBEZWZhdWx0IGZvciAvKy9tYXN0ZXIgaXMgK2xvZy4KKyAgICAgICAgfQorICAgICAgICB1cmwuYXBwZW5kKCcvJykuYXBwZW5kKHJldmlzaW9uLmdldE5hbWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQVRIOgorICAgICAgICB1cmwuYXBwZW5kKHJlcG9zaXRvcnlOYW1lKS5hcHBlbmQoIi8rLyIpLmFwcGVuZChyZXZpc2lvbi5nZXROYW1lKCkpLmFwcGVuZCgnLycpCisgICAgICAgICAgICAuYXBwZW5kKHBhdGgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRElGRjoKKyAgICAgICAgdXJsLmFwcGVuZChyZXBvc2l0b3J5TmFtZSkuYXBwZW5kKCIvKy8iKTsKKyAgICAgICAgaWYgKGlzRmlyc3RQYXJlbnQocmV2aXNpb24sIG9sZFJldmlzaW9uKSkgeworICAgICAgICAgIHVybC5hcHBlbmQocmV2aXNpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIl4hIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdXJsLmFwcGVuZChvbGRSZXZpc2lvbi5nZXROYW1lKCkpLmFwcGVuZCgiLi4iKS5hcHBlbmQocmV2aXNpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICB1cmwuYXBwZW5kKCcvJykuYXBwZW5kKHBhdGgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTE9HOgorICAgICAgICB1cmwuYXBwZW5kKHJlcG9zaXRvcnlOYW1lKS5hcHBlbmQoIi8rIik7CisgICAgICAgIGlmIChnZXRSZXZpc2lvbigpLm5hbWVJc0lkKCkgfHwgb2xkUmV2aXNpb24gIT0gUmV2aXNpb24uTlVMTCB8fCBwYXRoICE9IG51bGwpIHsKKyAgICAgICAgIC8vIERlZmF1bHQgZm9yIC8rL2MwZmZlZS8oLi4uKSBpcyArc2hvdy4KKyAgICAgICAgIC8vIERlZmF1bHQgZm9yIC8rL2MwZmZlZS4uZGVhZGJlZWYoLy4uLikgaXMgK2RpZmYuCisgICAgICAgICAgdXJsLmFwcGVuZCgibG9nIik7CisgICAgICAgIH0KKyAgICAgICAgdXJsLmFwcGVuZCgnLycpOworICAgICAgICBpZiAob2xkUmV2aXNpb24gIT0gUmV2aXNpb24uTlVMTCkgeworICAgICAgICAgIHVybC5hcHBlbmQob2xkUmV2aXNpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIi4uIik7CisgICAgICAgIH0KKyAgICAgICAgdXJsLmFwcGVuZChyZXZpc2lvbi5nZXROYW1lKCkpOworICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgdXJsLmFwcGVuZCgnLycpLmFwcGVuZChwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVua25vd24gdmlldyB0eXBlOiAiICsgdHlwZSk7CisgICAgfQorICAgIFN0cmluZyBiYXNlVXJsID0gTkFNRV9FU0NBUEVSLmFwcGx5KHVybC50b1N0cmluZygpKTsKKyAgICB1cmwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGlmICghcGFyYW1zLmlzRW1wdHkoKSkgeworICAgICAgdXJsLmFwcGVuZCgnPycpLmFwcGVuZChwYXJhbXNUb1N0cmluZyhwYXJhbXMpKTsKKyAgICB9CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoYW5jaG9yKSkgeworICAgICAgdXJsLmFwcGVuZCgnIycpLmFwcGVuZChOQU1FX0VTQ0FQRVIuYXBwbHkoYW5jaG9yKSk7CisgICAgfQorICAgIHJldHVybiBiYXNlVXJsICsgdXJsLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBnZXRCcmVhZGNydW1icygpIHsKKyAgICBTdHJpbmcgcGF0aCA9IHRoaXMucGF0aDsKKyAgICBJbW11dGFibGVMaXN0LkJ1aWxkZXI8TWFwPFN0cmluZywgU3RyaW5nPj4gYnJlYWRjcnVtYnMgPSBJbW11dGFibGVMaXN0LmJ1aWxkZXIoKTsKKyAgICBicmVhZGNydW1icy5hZGQoYnJlYWRjcnVtYihob3N0TmFtZSwgaG9zdEluZGV4KCkuY29weUZyb20odGhpcykpKTsKKyAgICBpZiAocmVwb3NpdG9yeU5hbWUgIT0gbnVsbCkgeworICAgICAgYnJlYWRjcnVtYnMuYWRkKGJyZWFkY3J1bWIocmVwb3NpdG9yeU5hbWUsIHJlcG9zaXRvcnlJbmRleCgpLmNvcHlGcm9tKHRoaXMpKSk7CisgICAgfQorICAgIGlmICh0eXBlID09IFR5cGUuRElGRikgeworICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBUd2VhayB0aGUgYnJlYWRjcnVtYnMgdGVtcGxhdGUgdG8gYWxsb3cgdXMgdG8gcmVuZGVyCisgICAgICAvLyBzZXBhcmF0ZSBsaW5rcyBpbiAib2xkLi5uZXciLgorICAgICAgYnJlYWRjcnVtYnMuYWRkKGJyZWFkY3J1bWIoZ2V0UmV2aXNpb25SYW5nZSgpLCBkaWZmKCkuY29weUZyb20odGhpcykuc2V0VHJlZVBhdGgoIiIpKSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGUuTE9HKSB7CisgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IEFkZCBzb21ldGhpbmcgaW4gdGhlIG5hdmlnYXRpb24gYXJlYSAocHJvYmFibHkgbm90CisgICAgICAvLyBhIGJyZWFkY3J1bWIpIHRvIGFsbG93IHN3aXRjaGluZyBiZXR3ZWVuIC8rbG9nLyBhbmQgLysvLgorICAgICAgaWYgKG9sZFJldmlzaW9uID09IFJldmlzaW9uLk5VTEwpIHsKKyAgICAgICAgYnJlYWRjcnVtYnMuYWRkKGJyZWFkY3J1bWIocmV2aXNpb24uZ2V0TmFtZSgpLCBsb2coKS5jb3B5RnJvbSh0aGlzKS5zZXRUcmVlUGF0aChudWxsKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWRjcnVtYnMuYWRkKGJyZWFkY3J1bWIoZ2V0UmV2aXNpb25SYW5nZSgpLCBsb2coKS5jb3B5RnJvbSh0aGlzKS5zZXRUcmVlUGF0aChudWxsKSkpOworICAgICAgfQorICAgICAgcGF0aCA9IFN0cmluZ3MuZW1wdHlUb051bGwocGF0aCk7CisgICAgfSBlbHNlIGlmIChyZXZpc2lvbiAhPSBSZXZpc2lvbi5OVUxMKSB7CisgICAgICBicmVhZGNydW1icy5hZGQoYnJlYWRjcnVtYihyZXZpc2lvbi5nZXROYW1lKCksIHJldmlzaW9uKCkuY29weUZyb20odGhpcykpKTsKKyAgICB9CisgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgaWYgKHR5cGUgIT0gVHlwZS5MT0cpIHsgLy8gVGhlICIuIiBicmVhZGNydW1iIHdvdWxkIGJlIG5vIGRpZmZlcmVudCBmb3IgTE9HLgorICAgICAgICBicmVhZGNydW1icy5hZGQoYnJlYWRjcnVtYigiLiIsIGNvcHlXaXRoUGF0aCgpLnNldFRyZWVQYXRoKCIiKSkpOworICAgICAgfQorICAgICAgU3RyaW5nQnVpbGRlciBjdXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKFN0cmluZyBwYXJ0IDogUmV2aXNpb25QYXJzZXIuUEFUSF9TUExJVFRFUi5vbWl0RW1wdHlTdHJpbmdzKCkuc3BsaXQocGF0aCkpIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIGN1ci5hcHBlbmQoJy8nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGN1ci5hcHBlbmQocGFydCk7CisgICAgICAgIGJyZWFkY3J1bWJzLmFkZChicmVhZGNydW1iKHBhcnQsIGNvcHlXaXRoUGF0aCgpLnNldFRyZWVQYXRoKGN1ci50b1N0cmluZygpKSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnJlYWRjcnVtYnMuYnVpbGQoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYnJlYWRjcnVtYihTdHJpbmcgdGV4dCwgQnVpbGRlciB1cmwpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgdGV4dCwgInVybCIsIHVybC50b1VybCgpKTsKKyAgfQorCisgIHByaXZhdGUgQnVpbGRlciBjb3B5V2l0aFBhdGgoKSB7CisgICAgQnVpbGRlciBjb3B5OworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBESUZGOgorICAgICAgICBjb3B5ID0gZGlmZigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTE9HOgorICAgICAgICBjb3B5ID0gbG9nKCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY29weSA9IHBhdGgoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBjb3B5LmNvcHlGcm9tKHRoaXMpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ZpcnN0UGFyZW50KFJldmlzaW9uIHJldjEsIFJldmlzaW9uIHJldjIpIHsKKyAgICByZXR1cm4gcmV2MiA9PSBSZXZpc2lvbi5OVUxMCisgICAgICAgIHx8IHJldjIuZ2V0TmFtZSgpLmVxdWFscyhyZXYxLmdldE5hbWUoKSArICJeIikKKyAgICAgICAgfHwgcmV2Mi5nZXROYW1lKCkuZXF1YWxzKHJldjEuZ2V0TmFtZSgpICsgIn4xIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyYW1zVG9TdHJpbmcoTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHsKKyAgICB0cnkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogcGFyYW1zLmVudHJpZXMoKSkgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBzYi5hcHBlbmQoJyYnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9CisgICAgICBzYi5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoZS5nZXRLZXkoKSwgQ2hhcnNldHMuVVRGXzgubmFtZSgpKSk7CisgICAgICBpZiAoISIiLmVxdWFscyhlLmdldFZhbHVlKCkpKSB7CisgICAgICAgIHNiLmFwcGVuZCgnPScpCisgICAgICAgICAgICAuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGUuZ2V0VmFsdWUoKSwgQ2hhcnNldHMuVVRGXzgubmFtZSgpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Ib3N0SW5kZXhTZXJ2bGV0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvSG9zdEluZGV4U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOWZmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvSG9zdEluZGV4U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuRm9ybWF0VHlwZS5KU09OOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuRm9ybWF0VHlwZS5URVhUOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQ7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX1NFUlZJQ0VfVU5BVkFJTEFCTEU7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ubmV0Lkh0dHBIZWFkZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5GaWVsZE5hbWluZ1BvbGljeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUudGVtcGxhdGUuc295LmRhdGEuU295TGlzdERhdGE7CitpbXBvcnQgY29tLmdvb2dsZS50ZW1wbGF0ZS5zb3kuZGF0YS5Tb3lNYXBEYXRhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFNlcnZlcyB0aGUgdG9wIGxldmVsIGluZGV4IHBhZ2UgZm9yIGEgR2l0aWxlcyBob3N0LiAqLworcHVibGljIGNsYXNzIEhvc3RJbmRleFNlcnZsZXQgZXh0ZW5kcyBCYXNlU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIb3N0SW5kZXhTZXJ2bGV0LmNsYXNzKTsKKworICBwcm90ZWN0ZWQgZmluYWwgR2l0aWxlc1VybHMgdXJsczsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeTsKKworICBwdWJsaWMgSG9zdEluZGV4U2VydmxldChSZW5kZXJlciByZW5kZXJlciwgR2l0aWxlc1VybHMgdXJscywKKyAgICAgIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5KSB7CisgICAgc3VwZXIocmVuZGVyZXIpOworICAgIHRoaXMudXJscyA9IGNoZWNrTm90TnVsbCh1cmxzLCAidXJscyIpOworICAgIHRoaXMuYWNjZXNzRmFjdG9yeSA9IGNoZWNrTm90TnVsbChhY2Nlc3NGYWN0b3J5LCAiYWNjZXNzRmFjdG9yeSIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZvcm1hdFR5cGUgZm9ybWF0OworICAgIHRyeSB7CisgICAgICBmb3JtYXQgPSBGb3JtYXRUeXBlLmdldEZvcm1hdFR5cGUocmVxKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXJyKSB7CisgICAgICByZXMuc2VuZEVycm9yKFNDX0JBRF9SRVFVRVNUKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTZXQ8U3RyaW5nPiBicmFuY2hlcyA9IHBhcnNlU2hvd0JyYW5jaChyZXEpOworICAgIE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4gZGVzY3M7CisgICAgdHJ5IHsKKyAgICAgIGRlc2NzID0gYWNjZXNzRmFjdG9yeS5mb3JSZXF1ZXN0KHJlcSkubGlzdFJlcG9zaXRvcmllcyhicmFuY2hlcyk7CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlcy5zZW5kRXJyb3IoU0NfTk9UX0ZPVU5EKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGNhdGNoIChTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXMuc2VuZEVycm9yKFNDX0ZPUkJJRERFTik7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gZSkgeworICAgICAgcmVzLnNlbmRFcnJvcihTQ19VTkFVVEhPUklaRUQpOworICAgICAgcmV0dXJuOworICAgIH0gY2F0Y2ggKFNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IFNob3cgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuCisgICAgICByZXMuc2VuZEVycm9yKFNDX0ZPUkJJRERFTik7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7CisgICAgICBTdHJpbmcgbmFtZSA9IHVybHMuZ2V0SG9zdE5hbWUocmVxKTsKKyAgICAgIGxvZy53YXJuKCJDYW5ub3Qgc2NhbiByZXBvc2l0b3JpZXMiICsgKG5hbWUgIT0gbnVsbCA/ICJmb3IgIiArIG5hbWUgOiAiIiksIGVycik7CisgICAgICByZXMuc2VuZEVycm9yKFNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICBjYXNlIEhUTUw6CisgICAgICBjYXNlIERFRkFVTFQ6CisgICAgICBkZWZhdWx0OgorICAgICAgICBkaXNwbGF5SHRtbChyZXEsIHJlcywgZGVzY3MpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBURVhUOgorICAgICAgICBkaXNwbGF5VGV4dChyZXEsIHJlcywgYnJhbmNoZXMsIGRlc2NzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSlNPTjoKKyAgICAgICAgZGlzcGxheUpzb24ocmVxLCByZXMsIGRlc2NzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTb3lNYXBEYXRhIHRvU295TWFwRGF0YShSZXBvc2l0b3J5RGVzY3JpcHRpb24gZGVzYywgR2l0aWxlc1ZpZXcgdmlldykgeworICAgIHJldHVybiBuZXcgU295TWFwRGF0YSgKKyAgICAgICAgIm5hbWUiLCBkZXNjLm5hbWUsCisgICAgICAgICJkZXNjcmlwdGlvbiIsIFN0cmluZ3MubnVsbFRvRW1wdHkoZGVzYy5kZXNjcmlwdGlvbiksCisgICAgICAgICJ1cmwiLCBHaXRpbGVzVmlldy5yZXBvc2l0b3J5SW5kZXgoKQorICAgICAgICAgICAgLmNvcHlGcm9tKHZpZXcpCisgICAgICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoZGVzYy5uYW1lKQorICAgICAgICAgICAgLnRvVXJsKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlIdG1sKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgTWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPiBkZXNjcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTb3lMaXN0RGF0YSByZXBvcyA9IG5ldyBTb3lMaXN0RGF0YSgpOworICAgIGZvciAoUmVwb3NpdG9yeURlc2NyaXB0aW9uIGRlc2MgOiBkZXNjcy52YWx1ZXMoKSkgeworICAgICAgcmVwb3MuYWRkKHRvU295TWFwRGF0YShkZXNjLCBWaWV3RmlsdGVyLmdldFZpZXcocmVxKSkpOworICAgIH0KKworICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMuaG9zdEluZGV4IiwgSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAiaG9zdE5hbWUiLCB1cmxzLmdldEhvc3ROYW1lKHJlcSksCisgICAgICAgICJiYXNlVXJsIiwgdXJscy5nZXRCYXNlR2l0VXJsKHJlcSksCisgICAgICAgICJyZXBvc2l0b3JpZXMiLCByZXBvcykpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlUZXh0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgU2V0PFN0cmluZz4gYnJhbmNoZXMsIE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4gZGVzY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmVzLnNldENvbnRlbnRUeXBlKFRFWFQuZ2V0TWltZVR5cGUoKSk7CisgICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOworICAgIHJlcy5zZXRIZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9ESVNQT1NJVElPTiwgImF0dGFjaG1lbnQiKTsKKyAgICBzZXROb3RDYWNoZWFibGUocmVzKTsKKworICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlcy5nZXRXcml0ZXIoKTsKKyAgICBmb3IgKFJlcG9zaXRvcnlEZXNjcmlwdGlvbiByZXBvIDogZGVzY3MudmFsdWVzKCkpIHsKKyAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBicmFuY2hlcykgeworICAgICAgICBTdHJpbmcgcmVmID0gcmVwby5icmFuY2hlcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChyZWYgPT0gbnVsbCkgeworICAgICAgICAgIC8vIFByaW50IHN0dWIgKGZvcnR5ICctJyBzeW1ib2xzKQorICAgICAgICAgIHJlZiA9ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIjsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnQocmVmKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICB9CisgICAgICB3cml0ZXIucHJpbnQoR2l0aWxlc1VybHMuTkFNRV9FU0NBUEVSLmFwcGx5KHJlcG8ubmFtZSkpOworICAgICAgd3JpdGVyLnByaW50KCdcbicpOworICAgIH0KKyAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB3cml0ZXIuY2xvc2UoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkaXNwbGF5SnNvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgIE1hcDxTdHJpbmcsIFJlcG9zaXRvcnlEZXNjcmlwdGlvbj4gZGVzY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmVzLnNldENvbnRlbnRUeXBlKEpTT04uZ2V0TWltZVR5cGUoKSk7CisgICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOworICAgIHJlcy5zZXRIZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9ESVNQT1NJVElPTiwgImF0dGFjaG1lbnQiKTsKKyAgICBzZXROb3RDYWNoZWFibGUocmVzKTsKKworICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlcy5nZXRXcml0ZXIoKTsKKyAgICBuZXcgR3NvbkJ1aWxkZXIoKQorICAgICAgICAuc2V0RmllbGROYW1pbmdQb2xpY3koRmllbGROYW1pbmdQb2xpY3kuTE9XRVJfQ0FTRV9XSVRIX1VOREVSU0NPUkVTKQorICAgICAgICAuc2V0UHJldHR5UHJpbnRpbmcoKQorICAgICAgICAuZ2VuZXJhdGVOb25FeGVjdXRhYmxlSnNvbigpCisgICAgICAgIC5jcmVhdGUoKQorICAgICAgICAudG9Kc29uKGRlc2NzLAorICAgICAgICAgIG5ldyBUeXBlVG9rZW48TWFwPFN0cmluZywgUmVwb3NpdG9yeURlc2NyaXB0aW9uPj4oKSB7fS5nZXRUeXBlKCksCisgICAgICAgICAgd3JpdGVyKTsKKyAgICB3cml0ZXIucHJpbnQoJ1xuJyk7CisgICAgd3JpdGVyLmNsb3NlKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBwYXJzZVNob3dCcmFuY2goSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIC8vIFJvdWdobHkgbWF0Y2ggR2Vycml0IENvZGUgUmV2aWV3J3MgL3Byb2plY3RzLyBBUEkgYnkgc3VwcG9ydGluZworICAgIC8vIGJvdGggc2hvdy1icmFuY2ggYW5kIGIgYXMgcXVlcnkgcGFyYW1ldGVycy4KKyAgICBTZXQ8U3RyaW5nPiBicmFuY2hlcyA9IFNldHMubmV3TGlua2VkSGFzaFNldCgpOworICAgIFN0cmluZ1tdIHZhbHVlcyA9IHJlcS5nZXRQYXJhbWV0ZXJWYWx1ZXMoInNob3ctYnJhbmNoIik7CisgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CisgICAgICBicmFuY2hlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKKyAgICB9CisgICAgdmFsdWVzID0gcmVxLmdldFBhcmFtZXRlclZhbHVlcygiYiIpOworICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgYnJhbmNoZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7CisgICAgfQorICAgIHJldHVybiBicmFuY2hlczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0h0bWxEaWZmRm9ybWF0dGVyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvSHRtbERpZmZGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2IxZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0h0bWxEaWZmRm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ0VzY2FwZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLlJhd1RleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wYXRjaC5GaWxlSGVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGF0Y2guRmlsZUhlYWRlci5QYXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJhd1BhcnNlVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogRm9ybWF0cyBhIHVuaWZpZWQgZm9ybWF0IHBhdGNoIGFzIFVURi04IGVuY29kZWQgSFRNTC4gKi8KK2ZpbmFsIGNsYXNzIEh0bWxEaWZmRm9ybWF0dGVyIGV4dGVuZHMgRGlmZkZvcm1hdHRlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBESUZGX0JFR0lOID0gIjxwcmUgY2xhc3M9XCJkaWZmLXVuaWZpZWRcIj4iLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERJRkZfRU5EID0gIjwvcHJlPiIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBIVU5LX0JFR0lOID0gIjxzcGFuIGNsYXNzPVwiaFwiPiIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gSFVOS19FTkQgPSAiPC9zcGFuPiIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMSU5FX0lOU0VSVF9CRUdJTiA9ICI8c3BhbiBjbGFzcz1cImlcIj4iLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExJTkVfREVMRVRFX0JFR0lOID0gIjxzcGFuIGNsYXNzPVwiZFwiPiIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTElORV9DSEFOR0VfQkVHSU4gPSAiPHNwYW4gY2xhc3M9XCJjXCI+Ii5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMSU5FX0VORCA9ICI8L3NwYW4+XG4iLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KTsKKworICBwcml2YXRlIGZpbmFsIFJlbmRlcmVyIHJlbmRlcmVyOworICBwcml2YXRlIGludCBmaWxlSW5kZXg7CisKKyAgSHRtbERpZmZGb3JtYXR0ZXIoUmVuZGVyZXIgcmVuZGVyZXIsIE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICBzdXBlcihvdXQpOworICAgIHRoaXMucmVuZGVyZXIgPSBjaGVja05vdE51bGwocmVuZGVyZXIsICJyZW5kZXJlciIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGZvcm1hdChMaXN0PD8gZXh0ZW5kcyBEaWZmRW50cnk+IGVudHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChmaWxlSW5kZXggPSAwOyBmaWxlSW5kZXggPCBlbnRyaWVzLnNpemUoKTsgZmlsZUluZGV4KyspIHsKKyAgICAgIGZvcm1hdChlbnRyaWVzLmdldChmaWxlSW5kZXgpKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZm9ybWF0KEZpbGVIZWFkZXIgaGRyLCBSYXdUZXh0IGEsIFJhd1RleHQgYikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHN0YXJ0ID0gaGRyLmdldFN0YXJ0T2Zmc2V0KCk7CisgICAgaW50IGVuZCA9IGhkci5nZXRFbmRPZmZzZXQoKTsKKyAgICBpZiAoIWhkci5nZXRIdW5rcygpLmlzRW1wdHkoKSkgeworICAgICAgZW5kID0gaGRyLmdldEh1bmtzKCkuZ2V0KDApLmdldFN0YXJ0T2Zmc2V0KCk7CisgICAgfQorICAgIHJlbmRlckhlYWRlcihSYXdQYXJzZVV0aWxzLmRlY29kZShoZHIuZ2V0QnVmZmVyKCksIHN0YXJ0LCBlbmQpKTsKKworICAgIGlmIChoZHIuZ2V0UGF0Y2hUeXBlKCkgPT0gUGF0Y2hUeXBlLlVOSUZJRUQpIHsKKyAgICAgIGdldE91dHB1dFN0cmVhbSgpLndyaXRlKERJRkZfQkVHSU4pOworICAgICAgZm9ybWF0KGhkci50b0VkaXRMaXN0KCksIGEsIGIpOworICAgICAgZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoRElGRl9FTkQpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZW5kZXJIZWFkZXIoU3RyaW5nIGhlYWRlcikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IGxmID0gaGVhZGVyLmluZGV4T2YoJ1xuJyk7CisgICAgU3RyaW5nIGZpcnN0OworICAgIFN0cmluZyByZXN0OworICAgIGlmICgwIDw9IGxmKSB7CisgICAgICBmaXJzdCA9IGhlYWRlci5zdWJzdHJpbmcoMCwgbGYpOworICAgICAgcmVzdCA9IGhlYWRlci5zdWJzdHJpbmcobGYgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgZmlyc3QgPSBoZWFkZXI7CisgICAgICByZXN0ID0gIiI7CisgICAgfQorICAgIGdldE91dHB1dFN0cmVhbSgpLndyaXRlKHJlbmRlcmVyLm5ld1JlbmRlcmVyKCJnaXRpbGVzLmRpZmZIZWFkZXIiKQorICAgICAgICAuc2V0RGF0YShJbW11dGFibGVNYXAub2YoImZpcnN0IiwgZmlyc3QsICJyZXN0IiwgcmVzdCwgImZpbGVJbmRleCIsIGZpbGVJbmRleCkpCisgICAgICAgIC5yZW5kZXIoKQorICAgICAgICAuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUh1bmtIZWFkZXIoaW50IGFTdGFydExpbmUsIGludCBhRW5kTGluZSwKKyAgICAgIGludCBiU3RhcnRMaW5lLCBpbnQgYkVuZExpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoSFVOS19CRUdJTik7CisgICAgLy8gVE9ETyhzb3ApOiBJZiBodW5rIGhlYWRlciBzdGFydHMgaW5jbHVkaW5nIG1ldGhvZCBuYW1lcywgZXNjYXBlIGl0LgorICAgIHN1cGVyLndyaXRlSHVua0hlYWRlcihhU3RhcnRMaW5lLCBhRW5kTGluZSwgYlN0YXJ0TGluZSwgYkVuZExpbmUpOworICAgIGdldE91dHB1dFN0cmVhbSgpLndyaXRlKEhVTktfRU5EKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUxpbmUoY2hhciBwcmVmaXgsIFJhd1RleHQgdGV4dCwgaW50IGN1cikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gTWFudWFsbHkgcmVuZGVyIGVhY2ggbGluZSwgcmF0aGVyIHRoYW4gaW52b2tlIGEgU295IHRlbXBsYXRlLiBUaGlzIG1ldGhvZAorICAgIC8vIGNhbiBiZSBjYWxsZWQgdGhvdXNhbmRzIG9mIHRpbWVzIGluIGEgc2luZ2xlIHJlcXVlc3QuIEF2b2lkIHVubmVjZXNzYXJ5CisgICAgLy8gb3ZlcmhlYWRzIGJ5IGZvcm1hdHRpbmcgYXMtaXMuCisgICAgT3V0cHV0U3RyZWFtIG91dCA9IGdldE91dHB1dFN0cmVhbSgpOworICAgIHN3aXRjaCAocHJlZml4KSB7CisgICAgICBjYXNlICcrJzoKKyAgICAgICAgb3V0LndyaXRlKExJTkVfSU5TRVJUX0JFR0lOKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICctJzoKKyAgICAgICAgb3V0LndyaXRlKExJTkVfREVMRVRFX0JFR0lOKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcgJzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG91dC53cml0ZShMSU5FX0NIQU5HRV9CRUdJTik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBvdXQud3JpdGUoU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSHRtbDQodGV4dC5nZXRTdHJpbmcoY3VyKSkuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBvdXQud3JpdGUoTElORV9FTkQpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTGlua2lmaWVyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTGlua2lmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1ZTZmNQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9MaW5raWZpZXIuamF2YQpAQCAtMCwwICsxLDk2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKiogTGlua2lmaWVyIGZvciBibG9ja3Mgb2YgdGV4dCBzdWNoIGFzIGNvbW1pdCBtZXNzYWdlIGRlc2NyaXB0aW9ucy4gKi8KK3B1YmxpYyBjbGFzcyBMaW5raWZpZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIExJTktfUEFUVEVSTjsKKworICBzdGF0aWMgeworICAgIC8vIEhUVFAgVVJMIHJlZ2V4IGFkYXB0ZWQgZnJvbSBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbC4KKyAgICBTdHJpbmcgcGFydCA9ICJbYS16QS1aMC05JF8uKyEqJywlOzpAPT8jL348Pi1dIjsKKyAgICBTdHJpbmcgaHR0cFVybCA9ICJodHRwcz86Ly8iICsKKyAgICAgICAgcGFydCArICJ7Mix9IiArCisgICAgICAgICIoPzpbKF0iICsgcGFydCArICIqIiArICJbKV0pKiIgKworICAgICAgICBwYXJ0ICsgIioiOworICAgIFN0cmluZyBjaGFuZ2VJZCA9ICJcXGJJWzAtOWEtZl17OCw0MH1cXGIiOworICAgIExJTktfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZShKb2luZXIub24oInwiKS5qb2luKAorICAgICAgICAiKCIgKyBodHRwVXJsICsgIikiLAorICAgICAgICAiKCIgKyBjaGFuZ2VJZCArICIpIikpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRpbGVzVXJscyB1cmxzOworCisgIHB1YmxpYyBMaW5raWZpZXIoR2l0aWxlc1VybHMgdXJscykgeworICAgIHRoaXMudXJscyA9IGNoZWNrTm90TnVsbCh1cmxzLCAidXJscyIpOworICB9CisKKyAgcHVibGljIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gbGlua2lmeShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIFN0cmluZyBiYXNlR2Vycml0VXJsID0gdXJscy5nZXRCYXNlR2Vycml0VXJsKHJlcSk7CisgICAgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBwYXJzZWQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBNYXRjaGVyIG0gPSBMSU5LX1BBVFRFUk4ubWF0Y2hlcihtZXNzYWdlKTsKKyAgICBpbnQgbGFzdCA9IDA7CisgICAgd2hpbGUgKG0uZmluZCgpKSB7CisgICAgICBhZGRUZXh0KHBhcnNlZCwgbWVzc2FnZS5zdWJzdHJpbmcobGFzdCwgbS5zdGFydCgpKSk7CisgICAgICBpZiAobS5ncm91cCgxKSAhPSBudWxsKSB7CisgICAgICAgIC8vIEJhcmUgVVJMLgorICAgICAgICBwYXJzZWQuYWRkKGxpbmsobS5ncm91cCgxKSwgbS5ncm91cCgxKSkpOworICAgICAgfSBlbHNlIGlmIChtLmdyb3VwKDIpICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGJhc2VHZXJyaXRVcmwgIT0gbnVsbCkgeworICAgICAgICAgIC8vIEdlcnJpdCBDaGFuZ2UtSWQuCisgICAgICAgICAgcGFyc2VkLmFkZChsaW5rKG0uZ3JvdXAoMiksIGJhc2VHZXJyaXRVcmwgKyAiIy9xLyIgKyBtLmdyb3VwKDIpICsgIixuLHoiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWRkVGV4dChwYXJzZWQsIG0uZ3JvdXAoMikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsYXN0ID0gbS5lbmQoKTsKKyAgICB9CisgICAgYWRkVGV4dChwYXJzZWQsIG1lc3NhZ2Uuc3Vic3RyaW5nKGxhc3QpKTsKKyAgICByZXR1cm4gcGFyc2VkOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBsaW5rKFN0cmluZyB0ZXh0LCBTdHJpbmcgdXJsKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZigidGV4dCIsIHRleHQsICJ1cmwiLCB1cmwpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUZXh0KExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gcGFydHMsIFN0cmluZyB0ZXh0KSB7CisgICAgaWYgKHRleHQuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwYXJ0cy5pc0VtcHR5KCkpIHsKKyAgICAgIHBhcnRzLmFkZChJbW11dGFibGVNYXAub2YoInRleHQiLCB0ZXh0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb2xkID0gcGFydHMuZ2V0KHBhcnRzLnNpemUoKSAtIDEpOworICAgICAgaWYgKCFvbGQuY29udGFpbnNLZXkoInVybCIpKSB7CisgICAgICAgIHBhcnRzLnNldChwYXJ0cy5zaXplKCkgLSAxLCBJbW11dGFibGVNYXAub2YoInRleHQiLCBvbGQuZ2V0KCJ0ZXh0IikgKyB0ZXh0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJ0cy5hZGQoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgdGV4dCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0xvZ1NlcnZsZXQuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Mb2dTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5NzdmNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Mb2dTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT3B0aW9uYWw7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2l0aWxlcy5Db21taXRTb3lEYXRhLktleVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXZXYWxrRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFiYnJldmlhdGVkT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb2xsb3dGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2T2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFNlcnZlcyBhbiBIVE1MIHBhZ2Ugd2l0aCBhIHNob3J0bG9nIGZvciBjb21taXRzIGFuZCBwYXRocy4gKi8KK3B1YmxpYyBjbGFzcyBMb2dTZXJ2bGV0IGV4dGVuZHMgQmFzZVNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTG9nU2VydmxldC5jbGFzcyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1BBUkFNID0gInMiOworCisgIHByaXZhdGUgZmluYWwgTGlua2lmaWVyIGxpbmtpZmllcjsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbGltaXQ7CisKKyAgcHVibGljIExvZ1NlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIsIExpbmtpZmllciBsaW5raWZpZXIpIHsKKyAgICB0aGlzKHJlbmRlcmVyLCBsaW5raWZpZXIsIDEwMCk7CisgIH0KKworICBwcml2YXRlIExvZ1NlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIsIExpbmtpZmllciBsaW5raWZpZXIsIGludCBsaW1pdCkgeworICAgIHN1cGVyKHJlbmRlcmVyKTsKKyAgICB0aGlzLmxpbmtpZmllciA9IGNoZWNrTm90TnVsbChsaW5raWZpZXIsICJsaW5raWZpZXIiKTsKKyAgICBjaGVja0FyZ3VtZW50KGxpbWl0ID49IDAsICJsaW1pdCBtdXN0IGJlIHBvc2l0aXZlOiAlcyIsIGxpbWl0KTsKKyAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgIFJlcG9zaXRvcnkgcmVwbyA9IFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSk7CisgICAgUmV2V2FsayB3YWxrID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgdHJ5IHsKKyAgICAgICAgd2FsayA9IG5ld1dhbGsocmVwbywgdmlldyk7CisgICAgICB9IGNhdGNoIChJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIE9wdGlvbmFsPE9iamVjdElkPiBzdGFydCA9IGdldFN0YXJ0KHZpZXcuZ2V0UGFyYW1ldGVycygpLCB3YWxrLmdldE9iamVjdFJlYWRlcigpKTsKKyAgICAgIGlmIChzdGFydCA9PSBudWxsKSB7CisgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDUpOworCisgICAgICBpZiAoIXZpZXcuZ2V0UmV2aXNpb24oKS5uYW1lSXNJZCgpKSB7CisgICAgICAgIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gdGFncyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhFeHBlY3RlZFNpemUoMSk7CisgICAgICAgIGZvciAoUmV2T2JqZWN0IG8gOiBSZXZpc2lvblNlcnZsZXQubGlzdE9iamVjdHMod2Fsaywgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpKSB7CisgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZXZUYWcpIHsKKyAgICAgICAgICAgIHRhZ3MuYWRkKG5ldyBUYWdTb3lEYXRhKGxpbmtpZmllciwgcmVxKS50b1NveURhdGEoKFJldlRhZykgbykpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXRhZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgZGF0YS5wdXQoInRhZ3MiLCB0YWdzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBQYWdpbmF0b3IgcGFnaW5hdG9yID0gbmV3IFBhZ2luYXRvcih3YWxrLCBsaW1pdCwgc3RhcnQub3JOdWxsKCkpOworICAgICAgTWFwPEFueU9iamVjdElkLCBTZXQ8UmVmPj4gcmVmc0J5SWQgPSByZXBvLmdldEFsbFJlZnNCeVBlZWxlZE9iamVjdElkKCk7CisgICAgICBMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGVudHJpZXMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkobGltaXQpOworICAgICAgZm9yIChSZXZDb21taXQgYyA6IHBhZ2luYXRvcikgeworICAgICAgICBlbnRyaWVzLmFkZChuZXcgQ29tbWl0U295RGF0YShudWxsLCByZXEsIHJlcG8sIHdhbGssIHZpZXcsIHJlZnNCeUlkKQorICAgICAgICAgICAgLnRvU295RGF0YShjLCBLZXlTZXQuU0hPUlRMT0cpKTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nIHRpdGxlID0gIkxvZyAtICI7CisgICAgICBpZiAodmlldy5nZXRPbGRSZXZpc2lvbigpICE9IFJldmlzaW9uLk5VTEwpIHsKKyAgICAgICAgdGl0bGUgKz0gdmlldy5nZXRSZXZpc2lvblJhbmdlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aXRsZSArPSB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpOworICAgICAgfQorCisgICAgICBkYXRhLnB1dCgidGl0bGUiLCB0aXRsZSk7CisgICAgICBkYXRhLnB1dCgiZW50cmllcyIsIGVudHJpZXMpOworICAgICAgT2JqZWN0SWQgbmV4dCA9IHBhZ2luYXRvci5nZXROZXh0U3RhcnQoKTsKKyAgICAgIGlmIChuZXh0ICE9IG51bGwpIHsKKyAgICAgICAgZGF0YS5wdXQoIm5leHRVcmwiLCBjb3B5QW5kQ2Fub25pY2FsaXplKHZpZXcpCisgICAgICAgICAgICAucmVwbGFjZVBhcmFtKFNUQVJUX1BBUkFNLCBuZXh0Lm5hbWUoKSkKKyAgICAgICAgICAgIC50b1VybCgpKTsKKyAgICAgIH0KKyAgICAgIE9iamVjdElkIHByZXYgPSBwYWdpbmF0b3IuZ2V0UHJldmlvdXNTdGFydCgpOworICAgICAgaWYgKHByZXYgIT0gbnVsbCkgeworICAgICAgICBHaXRpbGVzVmlldy5CdWlsZGVyIHByZXZWaWV3ID0gY29weUFuZENhbm9uaWNhbGl6ZSh2aWV3KTsKKyAgICAgICAgaWYgKCFwcmV2Vmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkuZXF1YWxzKHByZXYpKSB7CisgICAgICAgICAgcHJldlZpZXcucmVwbGFjZVBhcmFtKFNUQVJUX1BBUkFNLCBwcmV2Lm5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS5wdXQoInByZXZpb3VzVXJsIiwgcHJldlZpZXcudG9VcmwoKSk7CisgICAgICB9CisKKyAgICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMubG9nRGV0YWlsIiwgZGF0YSk7CisgICAgfSBjYXRjaCAoUmV2V2Fsa0V4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cud2FybigiRXJyb3IgaW4gcmV2IHdhbGsiLCBlKTsKKyAgICAgIHJlcy5zZXRTdGF0dXMoU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHdhbGsgIT0gbnVsbCkgeworICAgICAgICB3YWxrLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBHaXRpbGVzVmlldy5CdWlsZGVyIGNvcHlBbmRDYW5vbmljYWxpemUoR2l0aWxlc1ZpZXcgdmlldykgeworICAgIC8vIENhbm9uaWNhbGl6ZSB0aGUgdmlldyBieSB1c2luZyBmdWxsIFNIQXMuCisgICAgR2l0aWxlc1ZpZXcuQnVpbGRlciBjb3B5ID0gR2l0aWxlc1ZpZXcubG9nKCkuY29weUZyb20odmlldykKKyAgICAgICAgLnNldFJldmlzaW9uKHZpZXcuZ2V0UmV2aXNpb24oKSk7CisgICAgaWYgKHZpZXcuZ2V0T2xkUmV2aXNpb24oKSAhPSBSZXZpc2lvbi5OVUxMKSB7CisgICAgICBjb3B5LnNldE9sZFJldmlzaW9uKHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgfQorICAgIHJldHVybiBjb3B5OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9uYWw8T2JqZWN0SWQ+IGdldFN0YXJ0KExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zLAorICAgICAgT2JqZWN0UmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gcGFyYW1zLmdldChTVEFSVF9QQVJBTSk7CisgICAgc3dpdGNoICh2YWx1ZXMuc2l6ZSgpKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBPcHRpb25hbC5hYnNlbnQoKTsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgQ29sbGVjdGlvbjxPYmplY3RJZD4gaWRzID0gcmVhZGVyLnJlc29sdmUoQWJicmV2aWF0ZWRPYmplY3RJZC5mcm9tU3RyaW5nKHZhbHVlcy5nZXQoMCkpKTsKKyAgICAgICAgaWYgKGlkcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihJdGVyYWJsZXMuZ2V0T25seUVsZW1lbnQoaWRzKSk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXZXYWxrIG5ld1dhbGsoUmVwb3NpdG9yeSByZXBvLCBHaXRpbGVzVmlldyB2aWV3KQorICAgICAgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZXBvKTsKKyAgICB3YWxrLm1hcmtTdGFydCh3YWxrLnBhcnNlQ29tbWl0KHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKSk7CisgICAgaWYgKHZpZXcuZ2V0T2xkUmV2aXNpb24oKSAhPSBSZXZpc2lvbi5OVUxMKSB7CisgICAgICB3YWxrLm1hcmtVbmludGVyZXN0aW5nKHdhbGsucGFyc2VDb21taXQodmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpKTsKKyAgICB9CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkodmlldy5nZXRUcmVlUGF0aCgpKSkgeworICAgICAgd2Fsay5zZXRUcmVlRmlsdGVyKEZvbGxvd0ZpbHRlci5jcmVhdGUodmlldy5nZXRUcmVlUGF0aCgpKSk7CisgICAgfQorICAgIHJldHVybiB3YWxrOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGFnaW5hdG9yLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGFnaW5hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1NDU1NgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYWdpbmF0b3IuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJldldhbGtFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5RGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkRlcXVlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8qKgorICogV3JhcHBlciBhcm91bmQge0BsaW5rIFJldldhbGt9IHRoYXQgcGFnaW5hdGVzIGZvciBHaXRpbGVzLgorICoKKyAqIEEgc2luZ2xlIHBhZ2Ugb2YgYSBzaG9ydGxvZyBpcyBkZWZpbmVkIGJ5IGEgcmV2aXNpb24gcmFuZ2UsIHN1Y2ggYXMgIm1hc3RlciIKKyAqIG9yICJtYXN0ZXIuLm5leHQiLCBhIHBhZ2Ugc2l6ZSwgYW5kIGEgc3RhcnQgY29tbWl0LCBzdWNoIGFzICJjMGZmZWUiLiBUaGUKKyAqIGRpc3RhbmNlIGJldHdlZW4gdGhlIGZpcnN0IGNvbW1pdCBpbiB0aGUgd2FsayAoIm5leHQiKSBhbmQgdGhlIGZpcnN0IGNvbW1pdAorICogaW4gdGhlIHBhZ2UgbWF5IGJlIGFyYml0cmFyaWx5IGxvbmcsIGJ1dCBpbiBvcmRlciB0byBwcmVzZW50IHRoZSBjb21taXQgbGlzdAorICogaW4gYSBzdGFibGUgd2F5LCB3ZSBtdXN0IGFsd2F5cyBzdGFydCBmcm9tIHRoZSBmaXJzdCBjb21taXQgaW4gdGhlIHdhbGsuIFRoaXMKKyAqIGlzIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGFyYml0cmFyeSBtZXJnZSBjb21taXRzIGJldHdlZW4gImMwZmZlZSIgYW5kICJuZXh0IgorICogdGhhdCBlZmZlY3RpdmVseSBpbnNlcnQgYXJiaXRyYXJ5IGNvbW1pdHMgaW50byB0aGUgaGlzdG9yeSBzdGFydGluZyBmcm9tCisgKiAiYzBmZmVlIi4KKyAqLworY2xhc3MgUGFnaW5hdG9yIGltcGxlbWVudHMgSXRlcmFibGU8UmV2Q29tbWl0PiB7CisgIHByaXZhdGUgZmluYWwgUmV2V2FsayB3YWxrOworICBwcml2YXRlIGZpbmFsIE9iamVjdElkIHN0YXJ0OworICBwcml2YXRlIGZpbmFsIGludCBsaW1pdDsKKyAgcHJpdmF0ZSBmaW5hbCBEZXF1ZTxPYmplY3RJZD4gcHJldkJ1ZmZlcjsKKworICBwcml2YXRlIGJvb2xlYW4gZG9uZTsKKyAgcHJpdmF0ZSBpbnQgaTsKKyAgcHJpdmF0ZSBpbnQgbjsKKyAgcHJpdmF0ZSBpbnQgZm91bmRJbmRleDsKKyAgcHJpdmF0ZSBPYmplY3RJZCBuZXh0U3RhcnQ7CisKKyAgLyoqCisgICAqIEBwYXJhbSB3YWxrIHJldmlzaW9uIHdhbGsuCisgICAqIEBwYXJhbSBsaW1pdCBwYWdlIHNpemUuCisgICAqIEBwYXJhbSBzdGFydCBjb21taXQgYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHdhbGssIG9yIG51bGwgdG8gc3RhcnQgYXQgdGhlCisgICAqICAgICBiZWdpbm5pbmcuCisgICAqLworICBQYWdpbmF0b3IoUmV2V2FsayB3YWxrLCBpbnQgbGltaXQsIEBOdWxsYWJsZSBPYmplY3RJZCBzdGFydCkgeworICAgIHRoaXMud2FsayA9IGNoZWNrTm90TnVsbCh3YWxrLCAid2FsayIpOworICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICBjaGVja0FyZ3VtZW50KGxpbWl0ID4gMCwgImxpbWl0IG11c3QgYmUgcG9zaXRpdmU6ICVzIiwgbGltaXQpOworICAgIHRoaXMubGltaXQgPSBsaW1pdDsKKyAgICBwcmV2QnVmZmVyID0gbmV3IEFycmF5RGVxdWU8T2JqZWN0SWQ+KHN0YXJ0ICE9IG51bGwgPyBsaW1pdCA6IDApOworICAgIGkgPSAtMTsKKyAgICBmb3VuZEluZGV4ID0gLTE7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhpcyBwYWdlIG9mIHRoZSB3YWxrLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQsIG9yIG51bGwgaWYgdGhlIHdhbGsgaXMgZmluaXNoZWQuCisgICAqCisgICAqIEB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiBTZWUge0BsaW5rIFJldldhbGsjbmV4dCgpfS4KKyAgICogQHRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIFNlZSB7QGxpbmsgUmV2V2FsayNuZXh0KCl9LgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNlZSB7QGxpbmsgUmV2V2FsayNuZXh0KCl9LgorICAgKi8KKyAgcHVibGljIFJldkNvbW1pdCBuZXh0KCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCisgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IGNvbW1pdDsKKyAgICBpZiAoZm91bmRJbmRleCA8IDApIHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGNvbW1pdCA9IHdhbGsubmV4dCgpOworICAgICAgICBpZiAoY29tbWl0ID09IG51bGwpIHsKKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0LmVxdWFscyhjb21taXQpKSB7CisgICAgICAgICAgZm91bmRJbmRleCA9IGk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZCdWZmZXIuc2l6ZSgpID09IGxpbWl0KSB7CisgICAgICAgICAgcHJldkJ1ZmZlci5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgICAgICBwcmV2QnVmZmVyLmFkZChjb21taXQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb21taXQgPSB3YWxrLm5leHQoKTsKKyAgICB9CisKKyAgICBpZiAoKytuID09IGxpbWl0KSB7CisgICAgICBkb25lID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG4gPT0gbGltaXQgKyAxIHx8IGNvbW1pdCA9PSBudWxsKSB7CisgICAgICBuZXh0U3RhcnQgPSBjb21taXQ7CisgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gY29tbWl0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIElEIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFnZSBvZiByZXN1bHRzIHByZWNlZGluZyB0aGlzIG9uZSwgb3IKKyAgICogICAgIG51bGwgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFnZS4KKyAgICovCisgIHB1YmxpYyBPYmplY3RJZCBnZXRQcmV2aW91c1N0YXJ0KCkgeworICAgIGNoZWNrU3RhdGUoZG9uZSwgImdldFByZXZpb3VzU3RhcnQoKSBpbnZhbGlkIGJlZm9yZSB3YWxrIGRvbmUiKTsKKyAgICByZXR1cm4gcHJldkJ1ZmZlci5wb2xsRmlyc3QoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBJRCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhZ2Ugb2YgcmVzdWx0cyBhZnRlciB0aGlzIG9uZSwgb3IgbnVsbAorICAgKiAgICAgaWYgdGhpcyBpcyB0aGUgbGFzdCBwYWdlLgorICAgKi8KKyAgcHVibGljIE9iamVjdElkIGdldE5leHRTdGFydCgpIHsKKyAgICBjaGVja1N0YXRlKGRvbmUsICJnZXROZXh0U3RhcnQoKSBpbnZhbGlkIGJlZm9yZSB3YWxrIGRvbmUiKTsKKyAgICByZXR1cm4gbmV4dFN0YXJ0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgY29tbWl0cyBpbiB0aGlzIHdhbGsuCisgICAqIEB0aHJvd3MgUmV2V2Fsa0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZCwgd3JhcHBpbmcgdGhlIGNoZWNrZWQKKyAgICogICAgIGV4Y2VwdGlvbiBmcm9tIHtAbGluayAjbmV4dCgpfS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgSXRlcmF0b3I8UmV2Q29tbWl0PiBpdGVyYXRvcigpIHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yPFJldkNvbW1pdD4oKSB7CisgICAgICBSZXZDb21taXQgbmV4dCA9IG5leHRVbmNoZWNrZWQoKTsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBSZXZDb21taXQgbmV4dCgpIHsKKyAgICAgICAgUmV2Q29tbWl0IHIgPSBuZXh0OworICAgICAgICBuZXh0ID0gbmV4dFVuY2hlY2tlZCgpOworICAgICAgICByZXR1cm4gcjsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwcml2YXRlIFJldkNvbW1pdCBuZXh0VW5jaGVja2VkKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV4dCgpOworICAgIH0gY2F0Y2ggKE1pc3NpbmdPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJldldhbGtFeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmV2V2Fsa0V4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmV2V2Fsa0V4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYXRoU2VydmxldC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1BhdGhTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyODIwMgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYXRoU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMjc2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuVHJlZVNveURhdGEucmVzb2x2ZVRhcmdldFVybDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkxPQjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9DT01NSVQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfVFJFRTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTGFyZ2VPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2T2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlLlN1Ym1vZHVsZVdhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3UGFyc2VVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFNlcnZlcyBhbiBIVE1MIHBhZ2Ugd2l0aCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhdGggd2l0aGluIGEgdHJlZS4gKi8KKy8vIFRPRE8oZGJvcm93aXR6KTogSGFuZGxlIG5vbi1VVEYtOCBuYW1lcy4KK3B1YmxpYyBjbGFzcyBQYXRoU2VydmxldCBleHRlbmRzIEJhc2VTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBhdGhTZXJ2bGV0LmNsYXNzKTsKKworICAvKioKKyAgICogU3VibW9kdWxlIFVSTHMgd2hlcmUgd2Uga25vdyB0aGVyZSBpcyBhIHdlYiBwYWdlIGlmIHRoZSB1c2VyIHZpc2l0cyB0aGUKKyAgICogcmVwb3NpdG9yeSBVUkwgdmVyYmF0aW0gaW4gYSB3ZWIgYnJvd3Nlci4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gVkVSQkFUSU1fU1VCTU9EVUxFX1VSTF9QQVRURVJOID0KKyAgICAgIFBhdHRlcm4uY29tcGlsZSgiXigiICsgSm9pbmVyLm9uKCd8Jykuam9pbigKKyAgICAgICAgICAiaHR0cHM/Oi8vW14uXSsuZ29vZ2xlc291cmNlLmNvbS8uKiIsCisgICAgICAgICAgImh0dHBzPzovL1teLl0rLmdvb2dsZWNvZGUuY29tLy4qIiwKKyAgICAgICAgICAiaHR0cHM/Oi8vY29kZS5nb29nbGUuY29tL3AvLioiLAorICAgICAgICAgICJodHRwcz86Ly9naXRodWIuY29tLy4qIikgKyAiKSQiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOworCisgIHN0YXRpYyBlbnVtIEZpbGVUeXBlIHsKKyAgICBUUkVFKEZpbGVNb2RlLlRSRUUpLAorICAgIFNZTUxJTksoRmlsZU1vZGUuU1lNTElOSyksCisgICAgUkVHVUxBUl9GSUxFKEZpbGVNb2RlLlJFR1VMQVJfRklMRSksCisgICAgRVhFQ1VUQUJMRV9GSUxFKEZpbGVNb2RlLkVYRUNVVEFCTEVfRklMRSksCisgICAgR0lUTElOSyhGaWxlTW9kZS5HSVRMSU5LKTsKKworICAgIHByaXZhdGUgZmluYWwgRmlsZU1vZGUgbW9kZTsKKworICAgIHByaXZhdGUgRmlsZVR5cGUoRmlsZU1vZGUgbW9kZSkgeworICAgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICBzdGF0aWMgRmlsZVR5cGUgZm9yRW50cnkoVHJlZVdhbGsgdHcpIHsKKyAgICAgIGludCBtb2RlID0gdHcuZ2V0UmF3TW9kZSgwKTsKKyAgICAgIGZvciAoRmlsZVR5cGUgdHlwZSA6IHZhbHVlcygpKSB7CisgICAgICAgIGlmICh0eXBlLm1vZGUuZXF1YWxzKG1vZGUpKSB7CisgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBQYXRoU2VydmxldChSZW5kZXJlciByZW5kZXJlcikgeworICAgIHN1cGVyKHJlbmRlcmVyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSk7CisgICAgUmVwb3NpdG9yeSByZXBvID0gU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKTsKKworICAgIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZXBvKTsKKyAgICB0cnkgeworICAgICAgUmV2T2JqZWN0IG9iaiA9IHJ3LnBlZWwocncucGFyc2VBbnkodmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpKTsKKyAgICAgIFJldlRyZWUgcm9vdDsKKworICAgICAgc3dpdGNoIChvYmouZ2V0VHlwZSgpKSB7CisgICAgICAgIGNhc2UgT0JKX0NPTU1JVDoKKyAgICAgICAgICByb290ID0gKChSZXZDb21taXQpIG9iaikuZ2V0VHJlZSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9CSl9UUkVFOgorICAgICAgICAgIHJvb3QgPSAoUmV2VHJlZSkgb2JqOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIFRyZWVXYWxrIHR3OworICAgICAgRmlsZVR5cGUgdHlwZTsKKyAgICAgIFN0cmluZyBwYXRoID0gdmlldy5nZXRUcmVlUGF0aCgpOworICAgICAgaWYgKHBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIHR3ID0gbmV3IFRyZWVXYWxrKHJ3LmdldE9iamVjdFJlYWRlcigpKTsKKyAgICAgICAgdHcuYWRkVHJlZShyb290KTsKKyAgICAgICAgdHcuc2V0UmVjdXJzaXZlKGZhbHNlKTsKKyAgICAgICAgdHlwZSA9IEZpbGVUeXBlLlRSRUU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0dyA9IFRyZWVXYWxrLmZvclBhdGgocncuZ2V0T2JqZWN0UmVhZGVyKCksIHBhdGgsIHJvb3QpOworICAgICAgICBpZiAodHcgPT0gbnVsbCkgeworICAgICAgICAgIHJlcy5zZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHlwZSA9IEZpbGVUeXBlLmZvckVudHJ5KHR3KTsKKyAgICAgICAgaWYgKHR5cGUgPT0gRmlsZVR5cGUuVFJFRSkgeworICAgICAgICAgIHR3LmVudGVyU3VidHJlZSgpOworICAgICAgICAgIHR3LnNldFJlY3Vyc2l2ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVFJFRToKKyAgICAgICAgICBzaG93VHJlZShyZXEsIHJlcywgcncsIHR3LCBvYmopOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNZTUxJTks6CisgICAgICAgICAgc2hvd1N5bWxpbmsocmVxLCByZXMsIHJ3LCB0dyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHVUxBUl9GSUxFOgorICAgICAgICBjYXNlIEVYRUNVVEFCTEVfRklMRToKKyAgICAgICAgICBzaG93RmlsZShyZXEsIHJlcywgcncsIHR3KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHSVRMSU5LOgorICAgICAgICAgIHNob3dHaXRsaW5rKHJlcSwgcmVzLCBydywgdHcsIHJvb3QpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGxvZy5lcnJvcigiQmFkIGZpbGUgdHlwZTogJXMiLCB0eXBlKTsKKyAgICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBjYXRjaCAoTGFyZ2VPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgcmVzLnNldFN0YXR1cyhTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgIH0gZmluYWxseSB7CisgICAgICBydy5yZWxlYXNlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNob3dUcmVlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBSZXZXYWxrIHJ3LCBUcmVlV2FsayB0dywKKyAgICAgIE9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICAvLyBUT0RPKHNvcCk6IEFsbG93IGNhY2hpbmcgdHJlZXMgYnkgU0hBLTEgd2hlbiBubyBTIGNvb2tpZSBpcyBzZW50LgorICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMucGF0aERldGFpbCIsIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgInRpdGxlIiwgIXZpZXcuZ2V0VHJlZVBhdGgoKS5pc0VtcHR5KCkgPyB2aWV3LmdldFRyZWVQYXRoKCkgOiAiLyIsCisgICAgICAgICJ0eXBlIiwgRmlsZVR5cGUuVFJFRS50b1N0cmluZygpLAorICAgICAgICAiZGF0YSIsIG5ldyBUcmVlU295RGF0YShydywgdmlldykudG9Tb3lEYXRhKGlkLCB0dykpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzaG93RmlsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgUmV2V2FsayBydywgVHJlZVdhbGsgdHcpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBWaWV3RmlsdGVyLmdldFZpZXcocmVxKTsKKyAgICAvLyBUT0RPKHNvcCk6IEFsbG93IGNhY2hpbmcgZmlsZXMgYnkgU0hBLTEgd2hlbiBubyBTIGNvb2tpZSBpcyBzZW50LgorICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMucGF0aERldGFpbCIsIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgInRpdGxlIiwgVmlld0ZpbHRlci5nZXRWaWV3KHJlcSkuZ2V0VHJlZVBhdGgoKSwKKyAgICAgICAgInR5cGUiLCBGaWxlVHlwZS5mb3JFbnRyeSh0dykudG9TdHJpbmcoKSwKKyAgICAgICAgImRhdGEiLCBuZXcgQmxvYlNveURhdGEocncsIHZpZXcpLnRvU295RGF0YSh0dy5nZXRQYXRoU3RyaW5nKCksIHR3LmdldE9iamVjdElkKDApKSkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNob3dTeW1saW5rKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBSZXZXYWxrIHJ3LAorICAgICAgVHJlZVdhbGsgdHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgIE9iamVjdElkIGlkID0gdHcuZ2V0T2JqZWN0SWQoMCk7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICBPYmplY3RMb2FkZXIgbG9hZGVyID0gcncuZ2V0T2JqZWN0UmVhZGVyKCkub3BlbihpZCwgT0JKX0JMT0IpOworICAgIFN0cmluZyB0YXJnZXQ7CisgICAgdHJ5IHsKKyAgICAgIHRhcmdldCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKGxvYWRlci5nZXRDYWNoZWRCeXRlcyhUcmVlU295RGF0YS5NQVhfU1lNTElOS19TSVpFKSk7CisgICAgfSBjYXRjaCAoTGFyZ2VPYmplY3RFeGNlcHRpb24uT3V0T2ZNZW1vcnkgZSkgeworICAgICAgdGhyb3cgZTsKKyAgICB9IGNhdGNoIChMYXJnZU9iamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICBkYXRhLnB1dCgic2hhIiwgT2JqZWN0SWQudG9TdHJpbmcoaWQpKTsKKyAgICAgIGRhdGEucHV0KCJkYXRhIiwgbnVsbCk7CisgICAgICBkYXRhLnB1dCgic2l6ZSIsIExvbmcudG9TdHJpbmcobG9hZGVyLmdldFNpemUoKSkpOworICAgICAgcmVuZGVyKHJlcSwgcmVzLCAiZ2l0aWxlcy5wYXRoRGV0YWlsIiwgSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICJ0aXRsZSIsIFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpLmdldFRyZWVQYXRoKCksCisgICAgICAgICAgInR5cGUiLCBGaWxlVHlwZS5SRUdVTEFSX0ZJTEUudG9TdHJpbmcoKSwKKyAgICAgICAgICAiZGF0YSIsIGRhdGEpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcgdXJsID0gcmVzb2x2ZVRhcmdldFVybCgKKyAgICAgICAgR2l0aWxlc1ZpZXcucGF0aCgpCisgICAgICAgICAgICAuY29weUZyb20odmlldykKKyAgICAgICAgICAgIC5zZXRUcmVlUGF0aChkaXJuYW1lKHZpZXcuZ2V0VHJlZVBhdGgoKSkpCisgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgdGFyZ2V0KTsKKyAgICBkYXRhLnB1dCgidGl0bGUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGRhdGEucHV0KCJ0YXJnZXQiLCB0YXJnZXQpOworICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgZGF0YS5wdXQoInRhcmdldFVybCIsIHVybCk7CisgICAgfQorCisgICAgLy8gVE9ETyhzb3ApOiBBbGxvdyBjYWNoaW5nIGZpbGVzIGJ5IFNIQS0xIHdoZW4gbm8gUyBjb29raWUgaXMgc2VudC4KKyAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLnBhdGhEZXRhaWwiLCBJbW11dGFibGVNYXAub2YoCisgICAgICAgICJ0aXRsZSIsIFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpLmdldFRyZWVQYXRoKCksCisgICAgICAgICJ0eXBlIiwgRmlsZVR5cGUuU1lNTElOSy50b1N0cmluZygpLAorICAgICAgICAiZGF0YSIsIGRhdGEpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkaXJuYW1lKFN0cmluZyBwYXRoKSB7CisgICAgd2hpbGUgKHBhdGguY2hhckF0KHBhdGgubGVuZ3RoKCkgLSAxKSA9PSAnLycpIHsKKyAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gMSk7CisgICAgfQorICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgaWYgKGxhc3RTbGFzaCA+IDApIHsKKyAgICAgIHJldHVybiBwYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2ggLSAxKTsKKyAgICB9IGVsc2UgaWYgKGxhc3RTbGFzaCA9PSAwKSB7CisgICAgICByZXR1cm4gIi8iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIi4iOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzaG93R2l0bGluayhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgUmV2V2FsayBydywKKyAgICAgIFRyZWVXYWxrIHR3LCBSZXZUcmVlIHJvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgIFN1Ym1vZHVsZVdhbGsgc3cgPSBTdWJtb2R1bGVXYWxrLmZvclBhdGgoU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKSwgcm9vdCwKKyAgICAgICAgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIFN0cmluZyByZW1vdGVVcmw7CisgICAgdHJ5IHsKKyAgICAgIHJlbW90ZVVybCA9IHN3LmdldFJlbW90ZVVybCgpOworICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgIH0gZmluYWxseSB7CisgICAgICBzdy5yZWxlYXNlKCk7CisgICAgfQorCisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZGF0YS5wdXQoInNoYSIsIE9iamVjdElkLnRvU3RyaW5nKHR3LmdldE9iamVjdElkKDApKSk7CisgICAgZGF0YS5wdXQoInJlbW90ZVVybCIsIHJlbW90ZVVybCk7CisKKyAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogR3Vlc3Mgd2hlbiB3ZSBjYW4gcHV0IGNvbW1pdCBTSEFzIGluIHRoZSBVUkwuCisgICAgICBTdHJpbmcgaHR0cFVybCA9IHJlc29sdmVIdHRwVXJsKHJlbW90ZVVybCk7CisgICAgICBpZiAoaHR0cFVybCAhPSBudWxsKSB7CisgICAgICAgIGRhdGEucHV0KCJodHRwVXJsIiwgaHR0cFVybCk7CisgICAgICB9CisKKyAgICAgIC8vIFRPRE8oc29wKTogQWxsb3cgY2FjaGluZyBsaW5rcyBieSBTSEEtMSB3aGVuIG5vIFMgY29va2llIGlzIHNlbnQuCisgICAgICByZW5kZXIocmVxLCByZXMsICJnaXRpbGVzLnBhdGhEZXRhaWwiLCBJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgInRpdGxlIiwgdmlldy5nZXRUcmVlUGF0aCgpLAorICAgICAgICAgICJ0eXBlIiwgRmlsZVR5cGUuR0lUTElOSy50b1N0cmluZygpLAorICAgICAgICAgICJkYXRhIiwgZGF0YSkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc29sdmVIdHRwVXJsKFN0cmluZyByZW1vdGVVcmwpIHsKKyAgICByZXR1cm4gVkVSQkFUSU1fU1VCTU9EVUxFX1VSTF9QQVRURVJOLm1hdGNoZXIocmVtb3RlVXJsKS5tYXRjaGVzKCkgPyByZW1vdGVVcmwgOiBudWxsOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVuZGVyZXIuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyY2U2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS50ZW1wbGF0ZS5zb3kudG9mdS5Tb3lUb2Z1OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBSZW5kZXJlciBmb3IgU295IHRlbXBsYXRlcyB1c2VkIGJ5IEdpdGlsZXMuICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVuZGVyZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gU09ZX0ZJTEVOQU1FUyA9IEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAiQ29tbW9uLnNveSIsCisgICAgICAiRGlmZkRldGFpbC5zb3kiLAorICAgICAgIkhvc3RJbmRleC5zb3kiLAorICAgICAgIkxvZ0RldGFpbC5zb3kiLAorICAgICAgIk9iamVjdERldGFpbC5zb3kiLAorICAgICAgIlBhdGhEZXRhaWwuc295IiwKKyAgICAgICJSZXZpc2lvbkRldGFpbC5zb3kiLAorICAgICAgIlJlcG9zaXRvcnlJbmRleC5zb3kiKTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gU1RBVElDX1VSTF9HTE9CQUxTID0gSW1tdXRhYmxlTWFwLm9mKAorICAgICAgImdpdGlsZXMuQ1NTX1VSTCIsICJnaXRpbGVzLmNzcyIsCisgICAgICAiZ2l0aWxlcy5QUkVUVElGWV9DU1NfVVJMIiwgInByZXR0aWZ5L3ByZXR0aWZ5LmNzcyIsCisgICAgICAiZ2l0aWxlcy5QUkVUVElGWV9KU19VUkwiLCAicHJldHRpZnkvcHJldHRpZnkuanMiKTsKKworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSTCB0b0ZpbGVVUkwoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgaWYgKGZpbGVuYW1lID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5ldyBGaWxlKGZpbGVuYW1lKS50b1VSSSgpLnRvVVJMKCk7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIEltbXV0YWJsZUxpc3Q8VVJMPiB0ZW1wbGF0ZXM7CisgIHByb3RlY3RlZCBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IGdsb2JhbHM7CisKKyAgcHJvdGVjdGVkIFJlbmRlcmVyKEZ1bmN0aW9uPFN0cmluZywgVVJMPiByZXNvdXJjZU1hcHBlciwgTWFwPFN0cmluZywgU3RyaW5nPiBnbG9iYWxzLAorICAgICAgU3RyaW5nIHN0YXRpY1ByZWZpeCwgVVJMIGN1c3RvbVRlbXBsYXRlcykgeworICAgIGNoZWNrTm90TnVsbChzdGF0aWNQcmVmaXgsICJzdGF0aWNQcmVmaXgiKTsKKyAgICBMaXN0PFVSTD4gYWxsVGVtcGxhdGVzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KFNPWV9GSUxFTkFNRVMuc2l6ZSgpICsgMSk7CisgICAgZm9yIChTdHJpbmcgZmlsZW5hbWUgOiBTT1lfRklMRU5BTUVTKSB7CisgICAgICBhbGxUZW1wbGF0ZXMuYWRkKHJlc291cmNlTWFwcGVyLmFwcGx5KGZpbGVuYW1lKSk7CisgICAgfQorICAgIGlmIChjdXN0b21UZW1wbGF0ZXMgIT0gbnVsbCkgeworICAgICAgYWxsVGVtcGxhdGVzLmFkZChjdXN0b21UZW1wbGF0ZXMpOworICAgIH0gZWxzZSB7CisgICAgICBhbGxUZW1wbGF0ZXMuYWRkKHJlc291cmNlTWFwcGVyLmFwcGx5KCJEZWZhdWx0Q3VzdG9tVGVtcGxhdGVzLnNveSIpKTsKKyAgICB9CisgICAgdGVtcGxhdGVzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2YoYWxsVGVtcGxhdGVzKTsKKworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsR2xvYmFscyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogU1RBVElDX1VSTF9HTE9CQUxTLmVudHJ5U2V0KCkpIHsKKyAgICAgIGFsbEdsb2JhbHMucHV0KGUuZ2V0S2V5KCksIHN0YXRpY1ByZWZpeCArIGUuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIGFsbEdsb2JhbHMucHV0QWxsKGdsb2JhbHMpOworICAgIHRoaXMuZ2xvYmFscyA9IEltbXV0YWJsZU1hcC5jb3B5T2YoYWxsR2xvYmFscyk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZW5kZXIoSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmVuZGVyKHJlcywgdGVtcGxhdGVOYW1lLCBJbW11dGFibGVNYXAuPFN0cmluZywgT2JqZWN0PiBvZigpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlbmRlcihIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRlbXBsYXRlTmFtZSwgTWFwPFN0cmluZywgPz4gc295RGF0YSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKyAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7CisgICAgYnl0ZVtdIGRhdGEgPSBuZXdSZW5kZXJlcih0ZW1wbGF0ZU5hbWUpLnNldERhdGEoc295RGF0YSkucmVuZGVyKCkuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworICAgIHJlcy5zZXRDb250ZW50TGVuZ3RoKGRhdGEubGVuZ3RoKTsKKyAgICByZXMuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoZGF0YSk7CisgIH0KKworICBTb3lUb2Z1LlJlbmRlcmVyIG5ld1JlbmRlcmVyKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKKyAgICByZXR1cm4gZ2V0VG9mdSgpLm5ld1JlbmRlcmVyKHRlbXBsYXRlTmFtZSk7CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3QgU295VG9mdSBnZXRUb2Z1KCk7Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeURlc2NyaXB0aW9uLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeURlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlZTRkYQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5RGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKiBEZXNjcmliZXMgYSByZXBvc2l0b3J5IGluIHRoZSB7QGxpbmsgSG9zdEluZGV4U2VydmxldH0gSlNPTiBvdXRwdXQuICovCitwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeURlc2NyaXB0aW9uIHsKKyAgcHVibGljIFN0cmluZyBuYW1lOworICBwdWJsaWMgU3RyaW5nIGNsb25lVXJsOworICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uOworICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBicmFuY2hlczsKK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXBvc2l0b3J5SW5kZXhTZXJ2bGV0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeUluZGV4U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNTA2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeUluZGV4U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBTZXJ2ZXMgdGhlIGluZGV4IHBhZ2UgZm9yIGEgcmVwb3NpdG9yeSwgaWYgYWNjZXNzZWQgZGlyZWN0bHkgYnkgYSBicm93c2VyLiAqLworcHVibGljIGNsYXNzIFJlcG9zaXRvcnlJbmRleFNlcnZsZXQgZXh0ZW5kcyBCYXNlU2VydmxldCB7CisgIHByaXZhdGUgZmluYWwgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3Rvcnk7CisKKyAgcHVibGljIFJlcG9zaXRvcnlJbmRleFNlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIsIEdpdGlsZXNBY2Nlc3MuRmFjdG9yeSBhY2Nlc3NGYWN0b3J5KSB7CisgICAgc3VwZXIocmVuZGVyZXIpOworICAgIHRoaXMuYWNjZXNzRmFjdG9yeSA9IGNoZWNrTm90TnVsbChhY2Nlc3NGYWN0b3J5LCAiYWNjZXNzRmFjdG9yeSIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMucmVwb3NpdG9yeUluZGV4IiwgYnVpbGREYXRhKHJlcSkpOworICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIE1hcDxTdHJpbmcsID8+IGJ1aWxkRGF0YShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBkZXNjID0gYWNjZXNzRmFjdG9yeS5mb3JSZXF1ZXN0KHJlcSkuZ2V0UmVwb3NpdG9yeURlc2NyaXB0aW9uKCk7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgImNsb25lVXJsIiwgZGVzYy5jbG9uZVVybCwKKyAgICAgICAgImRlc2NyaXB0aW9uIiwgU3RyaW5ncy5udWxsVG9FbXB0eShkZXNjLmRlc2NyaXB0aW9uKSwKKyAgICAgICAgImJyYW5jaGVzIiwgZ2V0UmVmcyhyZXEsIENvbnN0YW50cy5SX0hFQURTKSwKKyAgICAgICAgInRhZ3MiLCBnZXRSZWZzKHJlcSwgQ29uc3RhbnRzLlJfVEFHUykpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IGdldFJlZnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgU3RyaW5nIHByZWZpeCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVmRGF0YWJhc2UgcmVmZGIgPSBTZXJ2bGV0VXRpbHMuZ2V0UmVwb3NpdG9yeShyZXEpLmdldFJlZkRhdGFiYXNlKCk7CisgICAgU3RyaW5nIHJlcG9OYW1lID0gVmlld0ZpbHRlci5nZXRWaWV3KHJlcSkuZ2V0UmVwb3NpdG9yeU5hbWUoKTsKKyAgICBDb2xsZWN0aW9uPFJlZj4gcmVmcyA9IFJlZkNvbXBhcmF0b3Iuc29ydChyZWZkYi5nZXRSZWZzKHByZWZpeCkudmFsdWVzKCkpOworICAgIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHJlZnMuc2l6ZSgpKTsKKworICAgIGZvciAoUmVmIHJlZiA6IHJlZnMpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gcmVmLmdldE5hbWUoKS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKTsKKyAgICAgIGJvb2xlYW4gbmVlZFByZWZpeCA9ICFyZWYuZ2V0TmFtZSgpLmVxdWFscyhyZWZkYi5nZXRSZWYobmFtZSkuZ2V0TmFtZSgpKTsKKyAgICAgIHJlc3VsdC5hZGQoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICJ1cmwiLCBHaXRpbGVzVmlldy5sb2coKS5jb3B5RnJvbShyZXEpLnNldFJldmlzaW9uKAorICAgICAgICAgICAgICBSZXZpc2lvbi51bnBlZWxlZChuZWVkUHJlZml4ID8gcmVmLmdldE5hbWUoKSA6IG5hbWUsIHJlZi5nZXRPYmplY3RJZCgpKSkudG9VcmwoKSwKKyAgICAgICAgICAibmFtZSIsIG5hbWUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb24uamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Nzc4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb24uamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkFEOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX1RBRzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQWJicmV2aWF0ZWRPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2T2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBPYmplY3QgZW5jYXBzdWxhdGluZyBhIHNpbmdsZSByZXZpc2lvbiBhcyBzZWVuIGJ5IEdpdGlsZXMuCisgKiA8cD4KKyAqIEEgc2luZ2xlIHJldmlzaW9uIGNvbnNpc3RzIG9mIGEgbmFtZSwgYW4gSUQsIGFuZCBhIHR5cGUuIE5hbWUgcGFyc2luZyBpcyBkb25lCisgKiBvbmNlIHBlciByZXF1ZXN0IGJ5IHtAbGluayBSZXZpc2lvblBhcnNlcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBSZXZpc2lvbiB7CisgIC8qKiBTZW50aW5lbCBpbmRpY2F0aW5nIGEgbWlzc2luZyBvciBlbXB0eSByZXZpc2lvbi4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXZpc2lvbiBOVUxMID0gcGVlbGVkKCIiLCBPYmplY3RJZC56ZXJvSWQoKSwgT0JKX0JBRCk7CisKKyAgLyoqIENvbW1vbiBkZWZhdWx0IGJyYW5jaCBnaXZlbiB0byBjbGllbnRzLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFJldmlzaW9uIEhFQUQgPSBuYW1lZCgiSEVBRCIpOworCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgIHByaXZhdGUgZmluYWwgT2JqZWN0SWQgaWQ7CisgIHByaXZhdGUgZmluYWwgaW50IHR5cGU7CisgIHByaXZhdGUgZmluYWwgT2JqZWN0SWQgcGVlbGVkSWQ7CisgIHByaXZhdGUgZmluYWwgaW50IHBlZWxlZFR5cGU7CisKKyAgcHVibGljIHN0YXRpYyBSZXZpc2lvbiBwZWVsZWQoU3RyaW5nIG5hbWUsIFJldk9iamVjdCBvYmopIHsKKyAgICByZXR1cm4gcGVlbGVkKG5hbWUsIG9iaiwgb2JqLmdldFR5cGUoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJldmlzaW9uIHVucGVlbGVkKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCkgeworICAgIHJldHVybiBwZWVsZWQobmFtZSwgaWQsIE9CSl9CQUQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBSZXZpc2lvbiBuYW1lZChTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBwZWVsZWQobmFtZSwgbnVsbCwgT0JKX0JBRCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJldmlzaW9uIHBlZWwoU3RyaW5nIG5hbWUsIE9iamVjdElkIGlkLCBSZXZXYWxrIHdhbGspCisgICAgICB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFJldk9iamVjdCBvYmogPSB3YWxrLnBhcnNlQW55KGlkKTsKKyAgICBSZXZPYmplY3QgcGVlbGVkID0gd2Fsay5wZWVsKG9iaik7CisgICAgcmV0dXJuIG5ldyBSZXZpc2lvbihuYW1lLCBvYmosIG9iai5nZXRUeXBlKCksIHBlZWxlZCwgcGVlbGVkLmdldFR5cGUoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXZpc2lvbiBwZWVsZWQoU3RyaW5nIG5hbWUsIE9iamVjdElkIGlkLCBpbnQgdHlwZSkgeworICAgIGNoZWNrQXJndW1lbnQodHlwZSAhPSBPQkpfVEFHLCAiZXhwZWN0ZWQgbm9uLXRhZyBmb3IgJXMvJXMiLCBuYW1lLCBpZCk7CisgICAgcmV0dXJuIG5ldyBSZXZpc2lvbihuYW1lLCBpZCwgdHlwZSwgaWQsIHR5cGUpOworICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIFJldmlzaW9uKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCwgaW50IHR5cGUsIE9iamVjdElkIHBlZWxlZElkLCBpbnQgcGVlbGVkVHlwZSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgdGhpcy5wZWVsZWRJZCA9IHBlZWxlZElkOworICAgIHRoaXMucGVlbGVkVHlwZSA9IHBlZWxlZFR5cGU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICBwdWJsaWMgT2JqZWN0SWQgZ2V0SWQoKSB7CisgICAgcmV0dXJuIGlkOworICB9CisKKyAgcHVibGljIE9iamVjdElkIGdldFBlZWxlZElkKCkgeworICAgIHJldHVybiBwZWVsZWRJZDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0UGVlbGVkVHlwZSgpIHsKKyAgICByZXR1cm4gcGVlbGVkVHlwZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIG5hbWVJc0lkKCkgeworICAgIHJldHVybiBBYmJyZXZpYXRlZE9iamVjdElkLmlzSWQobmFtZSkKKyAgICAgICAgJiYgKEFiYnJldmlhdGVkT2JqZWN0SWQuZnJvbVN0cmluZyhuYW1lKS5wcmVmaXhDb21wYXJlKGlkKSA9PSAwKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICBpZiAobyBpbnN0YW5jZW9mIFJldmlzaW9uKSB7CisgICAgICBSZXZpc2lvbiByID0gKFJldmlzaW9uKSBvOworICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWwobmFtZSwgci5uYW1lKQorICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwoaWQsIHIuaWQpCisgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbCh0eXBlLCByLnR5cGUpCisgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChwZWVsZWRJZCwgci5wZWVsZWRJZCkKKyAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKHBlZWxlZFR5cGUsIHIucGVlbGVkVHlwZSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUsIGlkLCB0eXBlLCBwZWVsZWRJZCwgcGVlbGVkVHlwZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQorICAgICAgICAub21pdE51bGxWYWx1ZXMoKQorICAgICAgICAuYWRkKCJuYW1lIiwgbmFtZSkKKyAgICAgICAgLmFkZCgiaWQiLCBpZCkKKyAgICAgICAgLmFkZCgidHlwZSIsIHR5cGUpCisgICAgICAgIC5hZGQoInBlZWxlZElkIiwgcGVlbGVkSWQpCisgICAgICAgIC5hZGQoInBlZWxlZFR5cGUiLCBwZWVsZWRUeXBlKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uUGFyc2VyLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25QYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTBhY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uUGFyc2VyLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJNYXRjaGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKiogT2JqZWN0IHRvIHBhcnNlIHJldmlzaW9ucyBvdXQgb2YgR2l0aWxlcyBwYXRocy4gKi8KK2NsYXNzIFJldmlzaW9uUGFyc2VyIHsKKyAgc3RhdGljIGZpbmFsIFNwbGl0dGVyIFBBVEhfU1BMSVRURVIgPSBTcGxpdHRlci5vbignLycpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGxpdHRlciBPUEVSQVRPUl9TUExJVFRFUiA9IFNwbGl0dGVyLm9uKENoYXJNYXRjaGVyLmFueU9mKCJefiIpKTsKKworICBzdGF0aWMgY2xhc3MgUmVzdWx0IHsKKyAgICBwcml2YXRlIGZpbmFsIFJldmlzaW9uIHJldmlzaW9uOworICAgIHByaXZhdGUgZmluYWwgUmV2aXNpb24gb2xkUmV2aXNpb247CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcGF0aFN0YXJ0OworCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgUmVzdWx0KFJldmlzaW9uIHJldmlzaW9uKSB7CisgICAgICB0aGlzKHJldmlzaW9uLCBudWxsLCByZXZpc2lvbi5nZXROYW1lKCkubGVuZ3RoKCkpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIFJlc3VsdChSZXZpc2lvbiByZXZpc2lvbiwgUmV2aXNpb24gb2xkUmV2aXNpb24sIGludCBwYXRoU3RhcnQpIHsKKyAgICAgIHRoaXMucmV2aXNpb24gPSByZXZpc2lvbjsKKyAgICAgIHRoaXMub2xkUmV2aXNpb24gPSBvbGRSZXZpc2lvbjsKKyAgICAgIHRoaXMucGF0aFN0YXJ0ID0gcGF0aFN0YXJ0OworICAgIH0KKworICAgIHB1YmxpYyBSZXZpc2lvbiBnZXRSZXZpc2lvbigpIHsKKyAgICAgIHJldHVybiByZXZpc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgUmV2aXNpb24gZ2V0T2xkUmV2aXNpb24oKSB7CisgICAgICByZXR1cm4gb2xkUmV2aXNpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlc3VsdCkgeworICAgICAgICBSZXN1bHQgciA9IChSZXN1bHQpIG87CisgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFsKHJldmlzaW9uLCByLnJldmlzaW9uKQorICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChvbGRSZXZpc2lvbiwgci5vbGRSZXZpc2lvbikKKyAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwocGF0aFN0YXJ0LCByLnBhdGhTdGFydCk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKHJldmlzaW9uLCBvbGRSZXZpc2lvbiwgcGF0aFN0YXJ0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIE9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgICAgICAub21pdE51bGxWYWx1ZXMoKQorICAgICAgICAgIC5hZGQoInJldmlzaW9uIiwgcmV2aXNpb24pCisgICAgICAgICAgLmFkZCgib2xkUmV2aXNpb24iLCBvbGRSZXZpc2lvbikKKyAgICAgICAgICAuYWRkKCJwYXRoU3RhcnQiLCBwYXRoU3RhcnQpCisgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgaW50IGdldFBhdGhTdGFydCgpIHsKKyAgICAgIHJldHVybiBwYXRoU3RhcnQ7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IHJlcG87CisgIHByaXZhdGUgZmluYWwgR2l0aWxlc0FjY2VzcyBhY2Nlc3M7CisgIHByaXZhdGUgZmluYWwgVmlzaWJpbGl0eUNhY2hlIGNhY2hlOworCisgIFJldmlzaW9uUGFyc2VyKFJlcG9zaXRvcnkgcmVwbywgR2l0aWxlc0FjY2VzcyBhY2Nlc3MsIFZpc2liaWxpdHlDYWNoZSBjYWNoZSkgeworICAgIHRoaXMucmVwbyA9IGNoZWNrTm90TnVsbChyZXBvLCAicmVwbyIpOworICAgIHRoaXMuYWNjZXNzID0gY2hlY2tOb3ROdWxsKGFjY2VzcywgImFjY2VzcyIpOworICAgIHRoaXMuY2FjaGUgPSBjaGVja05vdE51bGwoY2FjaGUsICJjYWNoZSIpOworICB9CisKKyAgUmVzdWx0IHBhcnNlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pOworICAgIHRyeSB7CisgICAgICBSZXZpc2lvbiBvbGRSZXZpc2lvbiA9IG51bGw7CisKKyAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoU3RyaW5nIHBhcnQgOiBQQVRIX1NQTElUVEVSLnNwbGl0KHBhdGgpKSB7CisgICAgICAgIGlmIChwYXJ0LmlzRW1wdHkoKSkgeworICAgICAgICAgIHJldHVybiBudWxsOyAvLyBObyB2YWxpZCByZXZpc2lvbiBjb250YWlucyBlbXB0eSBzZWdtZW50cy4KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgYi5hcHBlbmQoJy8nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvbGRSZXZpc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgaW50IGRvdHMgPSBwYXJ0LmluZGV4T2YoIi4uIik7CisgICAgICAgICAgaW50IGZpcnN0UGFyZW50ID0gcGFydC5pbmRleE9mKCJeISIpOworICAgICAgICAgIGlmIChkb3RzID09IDAgfHwgZmlyc3RQYXJlbnQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfSBlbHNlIGlmIChkb3RzID4gMCkgeworICAgICAgICAgICAgYi5hcHBlbmQocGFydC5zdWJzdHJpbmcoMCwgZG90cykpOworICAgICAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoIWlzVmFsaWRSZXZpc2lvbihvbGROYW1lKSkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIE9iamVjdElkIG9sZCA9IHJlcG8ucmVzb2x2ZShvbGROYW1lKTsKKyAgICAgICAgICAgICAgaWYgKG9sZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgb2xkUmV2aXNpb24gPSBSZXZpc2lvbi5wZWVsKG9sZE5hbWUsIG9sZCwgd2Fsayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJ0ID0gcGFydC5zdWJzdHJpbmcoZG90cyArIDIpOworICAgICAgICAgICAgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdFBhcmVudCA+IDApIHsKKyAgICAgICAgICAgIGlmIChmaXJzdFBhcmVudCAhPSBwYXJ0Lmxlbmd0aCgpIC0gMikgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIuYXBwZW5kKHBhcnQuc3Vic3RyaW5nKDAsIHBhcnQubGVuZ3RoKCkgLSAyKSk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICghaXNWYWxpZFJldmlzaW9uKG5hbWUpKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0SWQgaWQgPSByZXBvLnJlc29sdmUobmFtZSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJldkNvbW1pdCBjOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgYyA9IHdhbGsucGFyc2VDb21taXQoaWQpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBOb3QgYSBjb21taXQsIF4hIGlzIGludmFsaWQuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYy5nZXRQYXJlbnRDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICBvbGRSZXZpc2lvbiA9IFJldmlzaW9uLnBlZWxlZChuYW1lICsgIl4iLCBjLmdldFBhcmVudCgwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBvbGRSZXZpc2lvbiA9IFJldmlzaW9uLk5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQobmFtZSwgYyksIG9sZFJldmlzaW9uLCBuYW1lLmxlbmd0aCgpICsgMik7CisgICAgICAgICAgICByZXR1cm4gaXNWaXNpYmxlKHdhbGssIHJlc3VsdCkgPyByZXN1bHQgOiBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiLmFwcGVuZChwYXJ0KTsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGIudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKCFpc1ZhbGlkUmV2aXNpb24obmFtZSkpIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBPYmplY3RJZCBpZCA9IHJlcG8ucmVzb2x2ZShuYW1lKTsKKyAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICBpbnQgcGF0aFN0YXJ0OworICAgICAgICAgIGlmIChvbGRSZXZpc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXRoU3RhcnQgPSBuYW1lLmxlbmd0aCgpOyAvLyBmb28KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZm9vLi5iYXIgKGZvbyBtYXkgYmUgZW1wdHkpCisgICAgICAgICAgICBwYXRoU3RhcnQgPSBvbGRSZXZpc2lvbi5nZXROYW1lKCkubGVuZ3RoKCkgKyAyICsgbmFtZS5sZW5ndGgoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbChuYW1lLCBpZCwgd2FsayksIG9sZFJldmlzaW9uLCBwYXRoU3RhcnQpOworICAgICAgICAgIHJldHVybiBpc1Zpc2libGUod2FsaywgcmVzdWx0KSA/IHJlc3VsdCA6IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZmluYWxseSB7CisgICAgICB3YWxrLnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZXZpc2lvbihTdHJpbmcgcmV2aXNpb24pIHsKKyAgICAvLyBEaXNhbGxvdyBzb21lIHVuY29tbW9uIGJ1dCB2YWxpZCByZXZpc2lvbiBleHByZXNzaW9ucyB0aGF0IGVpdGhlciB3ZQorICAgIC8vIGRvbid0IHN1cHBvcnQgb3Igd2UgcmVwcmVzZW50IGRpZmZlcmVudGx5IGluIG91ciBVUkxzLgorICAgIHJldHVybiByZXZpc2lvbi5pbmRleE9mKCc6JykgPCAwCisgICAgICAgICYmIHJldmlzaW9uLmluZGV4T2YoIl57IikgPCAwCisgICAgICAgICYmIHJldmlzaW9uLmluZGV4T2YoJ0AnKSA8IDA7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaXNWaXNpYmxlKFJldldhbGsgd2FsaywgUmVzdWx0IHJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgbWF5YmVSZWYgPSBPUEVSQVRPUl9TUExJVFRFUi5zcGxpdChyZXN1bHQuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpLml0ZXJhdG9yKCkubmV4dCgpOworICAgIGlmIChyZXBvLmdldFJlZihtYXliZVJlZikgIT0gbnVsbCkgeworICAgICAgLy8gTmFtZSBjb250YWlucyBhIHZpc2libGUgcmVmOyBza2lwIGV4cGVuc2l2ZSByZWFjaGFiaWxpdHkgY2hlY2suCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFjYWNoZS5pc1Zpc2libGUocmVwbywgd2FsaywgYWNjZXNzLCByZXN1bHQuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocmVzdWx0LmdldE9sZFJldmlzaW9uKCkgIT0gbnVsbCAmJiByZXN1bHQuZ2V0T2xkUmV2aXNpb24oKSAhPSBSZXZpc2lvbi5OVUxMKSB7CisgICAgICByZXR1cm4gY2FjaGUuaXNWaXNpYmxlKHJlcG8sIHdhbGssIGFjY2VzcywgcmVzdWx0LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uU2VydmxldC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTcwODYKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmV2aXNpb25TZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9CTE9COworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0NPTU1JVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9UQUc7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfVFJFRTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5naXRpbGVzLkNvbW1pdFNveURhdGEuS2V5U2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldk9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VGFnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogU2VydmVzIGFuIEhUTUwgcGFnZSB3aXRoIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgcmVmLiAqLworcHVibGljIGNsYXNzIFJldmlzaW9uU2VydmxldCBleHRlbmRzIEJhc2VTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJldmlzaW9uU2VydmxldC5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBMaW5raWZpZXIgbGlua2lmaWVyOworCisgIHB1YmxpYyBSZXZpc2lvblNlcnZsZXQoUmVuZGVyZXIgcmVuZGVyZXIsIExpbmtpZmllciBsaW5raWZpZXIpIHsKKyAgICBzdXBlcihyZW5kZXJlcik7CisgICAgdGhpcy5saW5raWZpZXIgPSBjaGVja05vdE51bGwobGlua2lmaWVyLCAibGlua2lmaWVyIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpOworICAgIFJlcG9zaXRvcnkgcmVwbyA9IFNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5KHJlcSk7CisKKyAgICBSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZXBvKTsKKyAgICB0cnkgeworICAgICAgTGlzdDxSZXZPYmplY3Q+IG9iamVjdHMgPSBsaXN0T2JqZWN0cyh3YWxrLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgICBMaXN0PE1hcDxTdHJpbmcsID8+PiBzb3lPYmplY3RzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KG9iamVjdHMuc2l6ZSgpKTsKKyAgICAgIGJvb2xlYW4gaGFzQmxvYiA9IGZhbHNlOworCisgICAgICAvLyBUT0RPKHNvcCk6IEFsbG93IGNhY2hpbmcgY29tbWl0cyBieSBTSEEtMSB3aGVuIG5vIFMgY29va2llIGlzIHNlbnQuCisgICAgICBmb3IgKFJldk9iamVjdCBvYmogOiBvYmplY3RzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3dpdGNoIChvYmouZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIE9CSl9DT01NSVQ6CisgICAgICAgICAgICAgIHNveU9iamVjdHMuYWRkKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiwgQ29uc3RhbnRzLlRZUEVfQ09NTUlULAorICAgICAgICAgICAgICAgICAgImRhdGEiLCBuZXcgQ29tbWl0U295RGF0YShsaW5raWZpZXIsIHJlcSwgcmVwbywgd2FsaywgdmlldykKKyAgICAgICAgICAgICAgICAgICAgICAudG9Tb3lEYXRhKChSZXZDb21taXQpIG9iaiwgS2V5U2V0LkRFVEFJTF9ESUZGX1RSRUUpKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpfVFJFRToKKyAgICAgICAgICAgICAgc295T2JqZWN0cy5hZGQoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICAgICAgICAgInR5cGUiLCBDb25zdGFudHMuVFlQRV9UUkVFLAorICAgICAgICAgICAgICAgICAgImRhdGEiLCBuZXcgVHJlZVNveURhdGEod2FsaywgdmlldykudG9Tb3lEYXRhKG9iaikpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSl9CTE9COgorICAgICAgICAgICAgICBzb3lPYmplY3RzLmFkZChJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgICAgICAgICAidHlwZSIsIENvbnN0YW50cy5UWVBFX0JMT0IsCisgICAgICAgICAgICAgICAgICAiZGF0YSIsIG5ldyBCbG9iU295RGF0YSh3YWxrLCB2aWV3KS50b1NveURhdGEob2JqKSkpOworICAgICAgICAgICAgICBoYXNCbG9iID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSl9UQUc6CisgICAgICAgICAgICAgIHNveU9iamVjdHMuYWRkKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiwgQ29uc3RhbnRzLlRZUEVfVEFHLAorICAgICAgICAgICAgICAgICAgImRhdGEiLCBuZXcgVGFnU295RGF0YShsaW5raWZpZXIsIHJlcSkudG9Tb3lEYXRhKChSZXZUYWcpIG9iaikpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBsb2cud2FybigiQmFkIG9iamVjdCB0eXBlIGZvciAlczogJXMiLCBPYmplY3RJZC50b1N0cmluZyhvYmouZ2V0SWQoKSksIG9iai5nZXRUeXBlKCkpOworICAgICAgICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgICAgIGxvZy53YXJuKCJNaXNzaW5nIG9iamVjdCAiICsgT2JqZWN0SWQudG9TdHJpbmcob2JqLmdldElkKCkpLCBlKTsKKyAgICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBsb2cud2FybigiSW5jb3JyZWN0IG9iamVjdCB0eXBlIGZvciAiICsgT2JqZWN0SWQudG9TdHJpbmcob2JqLmdldElkKCkpLCBlKTsKKyAgICAgICAgICByZXMuc2V0U3RhdHVzKFNDX05PVF9GT1VORCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlbmRlcihyZXEsIHJlcywgImdpdGlsZXMucmV2aXNpb25EZXRhaWwiLCBJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgInRpdGxlIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSwKKyAgICAgICAgICAib2JqZWN0cyIsIHNveU9iamVjdHMsCisgICAgICAgICAgImhhc0Jsb2IiLCBoYXNCbG9iKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHdhbGsucmVsZWFzZSgpOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8oZGJvcm93aXR6KTogRXh0cmFjdCB0aGlzLgorICBzdGF0aWMgTGlzdDxSZXZPYmplY3Q+IGxpc3RPYmplY3RzKFJldldhbGsgd2FsaywgT2JqZWN0SWQgaWQpCisgICAgICB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIExpc3Q8UmV2T2JqZWN0PiBvYmplY3RzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgxKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgUmV2T2JqZWN0IGN1ciA9IHdhbGsucGFyc2VBbnkoaWQpOworICAgICAgb2JqZWN0cy5hZGQoY3VyKTsKKyAgICAgIGlmIChjdXIuZ2V0VHlwZSgpID09IENvbnN0YW50cy5PQkpfVEFHKSB7CisgICAgICAgIGlkID0gKChSZXZUYWcpIGN1cikuZ2V0T2JqZWN0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG9iamVjdHM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UYWdTb3lEYXRhLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGFnU295RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZGYxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGFnU295RGF0YS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRhZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuR2l0RGF0ZUZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuR2l0RGF0ZUZvcm1hdHRlci5Gb3JtYXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIFNveSBkYXRhIGNvbnZlcnRlciBmb3IgZ2l0IHRhZ3MuICovCitwdWJsaWMgY2xhc3MgVGFnU295RGF0YSB7CisgIHByaXZhdGUgZmluYWwgTGlua2lmaWVyIGxpbmtpZmllcjsKKyAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxOworICBwcml2YXRlIGZpbmFsIEdpdERhdGVGb3JtYXR0ZXIgZGF0ZUZvcm1hdHRlcjsKKworICBwdWJsaWMgVGFnU295RGF0YShMaW5raWZpZXIgbGlua2lmaWVyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgdGhpcy5saW5raWZpZXIgPSBsaW5raWZpZXI7CisgICAgdGhpcy5yZXEgPSByZXE7CisgICAgdGhpcy5kYXRlRm9ybWF0dGVyID0gbmV3IEdpdERhdGVGb3JtYXR0ZXIoRm9ybWF0LkRFRkFVTFQpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Tb3lEYXRhKFJldlRhZyB0YWcpIHsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDQpOworICAgIGRhdGEucHV0KCJzaGEiLCBPYmplY3RJZC50b1N0cmluZyh0YWcpKTsKKyAgICBpZiAodGFnLmdldFRhZ2dlcklkZW50KCkgIT0gbnVsbCkgeworICAgICAgZGF0YS5wdXQoInRhZ2dlciIsIENvbW1pdFNveURhdGEudG9Tb3lEYXRhKHRhZy5nZXRUYWdnZXJJZGVudCgpLCBkYXRlRm9ybWF0dGVyKSk7CisgICAgfQorICAgIGRhdGEucHV0KCJvYmplY3QiLCBPYmplY3RJZC50b1N0cmluZyh0YWcuZ2V0T2JqZWN0KCkpKTsKKyAgICBkYXRhLnB1dCgibWVzc2FnZSIsIGxpbmtpZmllci5saW5raWZ5KHJlcSwgdGFnLmdldEZ1bGxNZXNzYWdlKCkpKTsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RyZWVTb3lEYXRhLmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVHJlZVNveURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2JmNTQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RyZWVTb3lEYXRhLmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5SZXZpc2lvblBhcnNlci5QQVRIX1NQTElUVEVSOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0NPTU1JVDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5naXRpbGVzLlBhdGhTZXJ2bGV0LkZpbGVUeXBlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKKy8qKiBTb3kgZGF0YSBjb252ZXJ0ZXIgZm9yIGdpdCB0cmVlcy4gKi8KK3B1YmxpYyBjbGFzcyBUcmVlU295RGF0YSB7CisgIC8qKgorICAgKiBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBkaXNwbGF5IGZvciBhIHN5bWxpbmsgdGFyZ2V0LiBUYXJnZXRzIGxvbmdlciB0aGFuCisgICAqIHRoaXMgYXJlIGFiYnJldmlhdGVkIGZvciBkaXNwbGF5IGluIGEgdHJlZSBsaXN0aW5nLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TWU1MSU5LX1RBUkdFVF9MRU5HVEggPSA3MjsKKworICAvKioKKyAgICogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gbG9hZCBmcm9tIGEgYmxvYiB0aGF0IGNsYWltcyB0byBiZSBhIHN5bWxpbmsuIElmCisgICAqIHRoZSBibG9iIGlzIGxhcmdlciB0aGFuIHRoaXMgYnl0ZSBsaW1pdCBpdCB3aWxsIGJlIGRpc3BsYXllZCBhcyBhIGJpbmFyeQorICAgKiBmaWxlIGluc3RlYWQgb2YgYXMgYSBzeW1saW5rLgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGludCBNQVhfU1lNTElOS19TSVpFID0gMTYgPDwgMTA7CisKKyAgc3RhdGljIFN0cmluZyByZXNvbHZlVGFyZ2V0VXJsKEdpdGlsZXNWaWV3IHZpZXcsIFN0cmluZyB0YXJnZXQpIHsKKyAgICBpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gc2ltcGxpZnlQYXRoKCkgbm9ybWFsaXplcyAiYS8uLi8uLi8iIHRvICJhIiwgc28gbWFudWFsbHkgY2hlY2sgd2hldGhlcgorICAgIC8vIHRoZSBwYXRoIGxlYWRzIGFib3ZlIHRoZSBnaXQgcm9vdC4KKyAgICBpbnQgZGVwdGggPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZpZXcuZ2V0VHJlZVBhdGgoKSwgIi8iKS5jb3VudFRva2VucygpOworICAgIGZvciAoU3RyaW5nIHBhcnQgOiBQQVRIX1NQTElUVEVSLnNwbGl0KHRhcmdldCkpIHsKKyAgICAgIGlmIChwYXJ0LmVxdWFscygiLi4iKSkgeworICAgICAgICBkZXB0aC0tOworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoIXBhcnQuaXNFbXB0eSgpICYmICFwYXJ0LmVxdWFscygiLiIpKSB7CisgICAgICAgIGRlcHRoKys7CisgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIHBhdGggPSBGaWxlcy5zaW1wbGlmeVBhdGgodmlldy5nZXRUcmVlUGF0aCgpICsgIi8iICsgdGFyZ2V0KTsKKyAgICByZXR1cm4gR2l0aWxlc1ZpZXcucGF0aCgpCisgICAgICAgIC5jb3B5RnJvbSh2aWV3KQorICAgICAgICAuc2V0VHJlZVBhdGgoIXBhdGguZXF1YWxzKCIuIikgPyBwYXRoIDogIiIpCisgICAgICAgIC50b1VybCgpOworICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0RGlzcGxheU5hbWUoU3RyaW5nIHRhcmdldCkgeworICAgIGlmICh0YXJnZXQubGVuZ3RoKCkgPD0gTUFYX1NZTUxJTktfVEFSR0VUX0xFTkdUSCkgeworICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGxhc3RTbGFzaCA9IHRhcmdldC5sYXN0SW5kZXhPZignLycpOworICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBEb2Vzbid0IGFiYnJldmlhdGUgYSBsb25nIGxhc3QgcGF0aCBjb21wb25lbnQuCisgICAgICByZXR1cm4gbGFzdFNsYXNoID49IDAgPyAiLi4uIiArIHRhcmdldC5zdWJzdHJpbmcobGFzdFNsYXNoKSA6IHRhcmdldDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIFJldldhbGsgcnc7CisgIHByaXZhdGUgZmluYWwgR2l0aWxlc1ZpZXcgdmlldzsKKworICBwdWJsaWMgVHJlZVNveURhdGEoUmV2V2FsayBydywgR2l0aWxlc1ZpZXcgdmlldykgeworICAgIHRoaXMucncgPSBydzsKKyAgICB0aGlzLnZpZXcgPSB2aWV3OworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Tb3lEYXRhKE9iamVjdElkIHRyZWVJZCwgVHJlZVdhbGsgdHcpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorICAgICAgICAgSU9FeGNlcHRpb24geworICAgIExpc3Q8T2JqZWN0PiBlbnRyaWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgR2l0aWxlc1ZpZXcuQnVpbGRlciB1cmxCdWlsZGVyID0gR2l0aWxlc1ZpZXcucGF0aCgpLmNvcHlGcm9tKHZpZXcpOworICAgIHdoaWxlICh0dy5uZXh0KCkpIHsKKyAgICAgIEZpbGVUeXBlIHR5cGUgPSBGaWxlVHlwZS5mb3JFbnRyeSh0dyk7CisgICAgICBTdHJpbmcgbmFtZSA9IHR3LmdldE5hbWVTdHJpbmcoKTsKKworICAgICAgc3dpdGNoICh2aWV3LmdldFR5cGUoKSkgeworICAgICAgICBjYXNlIFBBVEg6CisgICAgICAgICAgdXJsQnVpbGRlci5zZXRUcmVlUGF0aCh2aWV3LmdldFRyZWVQYXRoKCkgKyAiLyIgKyBuYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZJU0lPTjoKKyAgICAgICAgICAvLyBHb3QgaGVyZSBmcm9tIGEgdGFnIHBvaW50aW5nIGF0IGEgdHJlZS4KKyAgICAgICAgICB1cmxCdWlsZGVyLnNldFRyZWVQYXRoKG5hbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgIkNhbm5vdCByZW5kZXIgVHJlZVNveURhdGEgZnJvbSAlcyB2aWV3Iiwgdmlldy5nZXRUeXBlKCkpKTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nIHVybCA9IHVybEJ1aWxkZXIudG9VcmwoKTsKKyAgICAgIGlmICh0eXBlID09IEZpbGVUeXBlLlRSRUUpIHsKKyAgICAgICAgbmFtZSArPSAiLyI7CisgICAgICAgIHVybCArPSAiLyI7CisgICAgICB9CisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZSg0KTsKKyAgICAgIGVudHJ5LnB1dCgidHlwZSIsIHR5cGUudG9TdHJpbmcoKSk7CisgICAgICBlbnRyeS5wdXQoIm5hbWUiLCBuYW1lKTsKKyAgICAgIGVudHJ5LnB1dCgidXJsIiwgdXJsKTsKKyAgICAgIGlmICh0eXBlID09IEZpbGVUeXBlLlNZTUxJTkspIHsKKyAgICAgICAgU3RyaW5nIHRhcmdldCA9IG5ldyBTdHJpbmcoCisgICAgICAgICAgICBydy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKHR3LmdldE9iamVjdElkKDApKS5nZXRDYWNoZWRCeXRlcygpLAorICAgICAgICAgICAgQ2hhcnNldHMuVVRGXzgpOworICAgICAgICAvLyBUT0RPKGRib3Jvd2l0eik6IE1lcmdlIFNoYXduJ3MgY2hhbmdlcyBiZWZvcmUgY29weWluZyB0aGVzZSBtZXRob2RzCisgICAgICAgIC8vIGluLgorICAgICAgICBlbnRyeS5wdXQoInRhcmdldE5hbWUiLCBnZXRUYXJnZXREaXNwbGF5TmFtZSh0YXJnZXQpKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldFVybCA9IHJlc29sdmVUYXJnZXRVcmwodmlldywgdGFyZ2V0KTsKKyAgICAgICAgaWYgKHRhcmdldFVybCAhPSBudWxsKSB7CisgICAgICAgICAgZW50cnkucHV0KCJ0YXJnZXRVcmwiLCB0YXJnZXRVcmwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7CisgICAgfQorCisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhID0gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZSgzKTsKKyAgICBkYXRhLnB1dCgic2hhIiwgdHJlZUlkLm5hbWUoKSk7CisgICAgZGF0YS5wdXQoImVudHJpZXMiLCBlbnRyaWVzKTsKKworICAgIGlmICh2aWV3LmdldFR5cGUoKSA9PSBHaXRpbGVzVmlldy5UeXBlLlBBVEgKKyAgICAgICAgJiYgdmlldy5nZXRSZXZpc2lvbigpLmdldFBlZWxlZFR5cGUoKSA9PSBPQkpfQ09NTUlUKSB7CisgICAgICBkYXRhLnB1dCgibG9nVXJsIiwgR2l0aWxlc1ZpZXcubG9nKCkuY29weUZyb20odmlldykudG9VcmwoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b1NveURhdGEoT2JqZWN0SWQgdHJlZUlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKHJ3LmdldE9iamVjdFJlYWRlcigpKTsKKyAgICB0dy5hZGRUcmVlKHRyZWVJZCk7CisgICAgdHcuc2V0UmVjdXJzaXZlKGZhbHNlKTsKKyAgICByZXR1cm4gdG9Tb3lEYXRhKHRyZWVJZCwgdHcpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlld0ZpbHRlci5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1ZpZXdGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc0YjFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1ZpZXdGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZS5XcmFwcGVkUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogRmlsdGVyIHRvIHBhcnNlIFVSTHMgYW5kIGNvbnZlcnQgdGhlbSB0byB7QGxpbmsgR2l0aWxlc1ZpZXd9cy4gKi8KK3B1YmxpYyBjbGFzcyBWaWV3RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RIdHRwRmlsdGVyIHsKKyAgLy8gVE9ETyhkYm9yb3dpdHopOiBNYWtlIHRoaXMgcHVibGljIGluIEpHaXQgKG9yIGltcGxlbWVudCBnZXRSZWdleEdyb3VwCisgIC8vIHVwc3RyZWFtKS4KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX0dST1VQU19BVFRSSUJVVEUgPQorICAgICAgIm9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZS5NZXRhU2VydmxldC5zZXJ2ZVJlZ2V4IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19BVFRJUkJVVEUgPSBWaWV3RmlsdGVyLmNsYXNzLmdldE5hbWUoKSArICIvVmlldyI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENNRF9BVVRPID0gIisiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01EX0RJRkYgPSAiK2RpZmYiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01EX0xPRyA9ICIrbG9nIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENNRF9TSE9XID0gIitzaG93IjsKKworICBwdWJsaWMgc3RhdGljIEdpdGlsZXNWaWV3IGdldFZpZXcoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHJldHVybiAoR2l0aWxlc1ZpZXcpIHJlcS5nZXRBdHRyaWJ1dGUoVklFV19BVFRJUkJVVEUpOworICB9CisKKyAgc3RhdGljIFN0cmluZyBnZXRSZWdleEdyb3VwKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIGludCBncm91cElkKSB7CisgICAgV3JhcHBlZFJlcXVlc3RbXSBncm91cHMgPSAoV3JhcHBlZFJlcXVlc3RbXSkgcmVxLmdldEF0dHJpYnV0ZShSRUdFWF9HUk9VUFNfQVRUUklCVVRFKTsKKyAgICByZXR1cm4gY2hlY2tOb3ROdWxsKGdyb3VwcylbZ3JvdXBJZF0uZ2V0UGF0aEluZm8oKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHNldFZpZXcoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgR2l0aWxlc1ZpZXcgdmlldykgeworICAgIHJlcS5zZXRBdHRyaWJ1dGUoVklFV19BVFRJUkJVVEUsIHZpZXcpOworICB9CisKKyAgc3RhdGljIFN0cmluZyB0cmltTGVhZGluZ1NsYXNoKFN0cmluZyBzdHIpIHsKKyAgICBjaGVja0FyZ3VtZW50KHN0ci5zdGFydHNXaXRoKCIvIiksICJleHBlY3RlZCBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhIHNsYXNoOiAlcyIsIHN0cik7CisgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIEdpdGlsZXNVcmxzIHVybHM7CisgIHByaXZhdGUgZmluYWwgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IGFjY2Vzc0ZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgVmlzaWJpbGl0eUNhY2hlIHZpc2liaWxpdHlDYWNoZTsKKworICBwdWJsaWMgVmlld0ZpbHRlcihHaXRpbGVzQWNjZXNzLkZhY3RvcnkgYWNjZXNzRmFjdG9yeSwgR2l0aWxlc1VybHMgdXJscywKKyAgICAgIFZpc2liaWxpdHlDYWNoZSB2aXNpYmlsaXR5Q2FjaGUpIHsKKyAgICB0aGlzLnVybHMgPSBjaGVja05vdE51bGwodXJscywgInVybHMiKTsKKyAgICB0aGlzLmFjY2Vzc0ZhY3RvcnkgPSBjaGVja05vdE51bGwoYWNjZXNzRmFjdG9yeSwgImFjY2Vzc0ZhY3RvcnkiKTsKKyAgICB0aGlzLnZpc2liaWxpdHlDYWNoZSA9IGNoZWNrTm90TnVsbCh2aXNpYmlsaXR5Q2FjaGUsICJ2aXNpYmlsaXR5Q2FjaGUiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3LkJ1aWxkZXIgdmlldyA9IHBhcnNlKHJlcSk7CisgICAgaWYgKHZpZXcgPT0gbnVsbCkgeworICAgICAgcmVzLnNldFN0YXR1cyhTQ19OT1RfRk9VTkQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1zID0gcmVxLmdldFBhcmFtZXRlck1hcCgpOworICAgIHZpZXcuc2V0SG9zdE5hbWUodXJscy5nZXRIb3N0TmFtZShyZXEpKQorICAgICAgICAuc2V0U2VydmxldFBhdGgocmVxLmdldENvbnRleHRQYXRoKCkgKyByZXEuZ2V0U2VydmxldFBhdGgoKSkKKyAgICAgICAgLnB1dEFsbFBhcmFtcyhwYXJhbXMpOworICAgIHNldFZpZXcocmVxLCB2aWV3LmJ1aWxkKCkpOworICAgIHRyeSB7CisgICAgICBjaGFpbi5kb0ZpbHRlcihyZXEsIHJlcyk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlcS5yZW1vdmVBdHRyaWJ1dGUoVklFV19BVFRJUkJVVEUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgR2l0aWxlc1ZpZXcuQnVpbGRlciBwYXJzZShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyByZXBvTmFtZSA9IHRyaW1MZWFkaW5nU2xhc2goZ2V0UmVnZXhHcm91cChyZXEsIDEpKTsKKyAgICBTdHJpbmcgY29tbWFuZCA9IGdldFJlZ2V4R3JvdXAocmVxLCAyKTsKKyAgICBTdHJpbmcgcGF0aCA9IGdldFJlZ2V4R3JvdXAocmVxLCAzKTsKKworICAgIC8vIE5vbi1wYXRoIGNhc2VzLgorICAgIGlmIChyZXBvTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBHaXRpbGVzVmlldy5ob3N0SW5kZXgoKTsKKyAgICB9IGVsc2UgaWYgKGNvbW1hbmQuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gR2l0aWxlc1ZpZXcucmVwb3NpdG9yeUluZGV4KCkuc2V0UmVwb3NpdG9yeU5hbWUocmVwb05hbWUpOworICAgIH0gZWxzZSBpZiAocGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBudWxsOyAvLyBDb21tYW5kIGJ1dCBubyBwYXRoLgorICAgIH0KKworICAgIHBhdGggPSB0cmltTGVhZGluZ1NsYXNoKHBhdGgpOworICAgIFJldmlzaW9uUGFyc2VyIHJldlBhcnNlciA9IG5ldyBSZXZpc2lvblBhcnNlcigKKyAgICAgICAgU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnkocmVxKSwgYWNjZXNzRmFjdG9yeS5mb3JSZXF1ZXN0KHJlcSksIHZpc2liaWxpdHlDYWNoZSk7CisgICAgUmV2aXNpb25QYXJzZXIuUmVzdWx0IHJlc3VsdCA9IHJldlBhcnNlci5wYXJzZShwYXRoKTsKKyAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcocmVzdWx0LmdldFBhdGhTdGFydCgpKTsKKworICAgIGNvbW1hbmQgPSBnZXRDb21tYW5kKGNvbW1hbmQsIHJlc3VsdCwgcGF0aCk7CisgICAgR2l0aWxlc1ZpZXcuQnVpbGRlciB2aWV3OworICAgIGlmIChDTURfTE9HLmVxdWFscyhjb21tYW5kKSkgeworICAgICAgdmlldyA9IEdpdGlsZXNWaWV3LmxvZygpLnNldFRyZWVQYXRoKHBhdGgpOworICAgIH0gZWxzZSBpZiAoQ01EX1NIT1cuZXF1YWxzKGNvbW1hbmQpKSB7CisgICAgICBpZiAocGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IEdpdGlsZXNWaWV3LnJldmlzaW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2aWV3ID0gR2l0aWxlc1ZpZXcucGF0aCgpLnNldFRyZWVQYXRoKHBhdGgpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoQ01EX0RJRkYuZXF1YWxzKGNvbW1hbmQpKSB7CisgICAgICB2aWV3ID0gR2l0aWxlc1ZpZXcuZGlmZigpLnNldFRyZWVQYXRoKHBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsgLy8gQmFkIGNvbW1hbmQuCisgICAgfQorICAgIGlmIChyZXN1bHQuZ2V0T2xkUmV2aXNpb24oKSAhPSBudWxsKSB7IC8vIE1heSBiZSBOVUxMLgorICAgICAgdmlldy5zZXRPbGRSZXZpc2lvbihyZXN1bHQuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgfQorICAgIHZpZXcuc2V0UmVwb3NpdG9yeU5hbWUocmVwb05hbWUpCisgICAgICAgIC5zZXRSZXZpc2lvbihyZXN1bHQuZ2V0UmV2aXNpb24oKSk7CisgICAgcmV0dXJuIHZpZXc7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRDb21tYW5kKFN0cmluZyBjb21tYW5kLCBSZXZpc2lvblBhcnNlci5SZXN1bHQgcmVzdWx0LCBTdHJpbmcgcGF0aCkgeworICAgIC8vIE5vdGU6IGlmIHlvdSBjaGFuZ2UgdGhlIG1hcHBpbmcgZm9yICssIG1ha2Ugc3VyZSB0byBjaGFuZ2UKKyAgICAvLyBHaXRpbGVzVmlldy50b1VybCgpIGNvcnJlc3BvbmRpbmdseS4KKyAgICBpZiAoIUNNRF9BVVRPLmVxdWFscyhjb21tYW5kKSkgeworICAgICAgcmV0dXJuIGNvbW1hbmQ7CisgICAgfSBlbHNlIGlmIChyZXN1bHQuZ2V0T2xkUmV2aXNpb24oKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gQ01EX0RJRkY7CisgICAgfQorICAgIFJldmlzaW9uIHJldiA9IHJlc3VsdC5nZXRSZXZpc2lvbigpOworICAgIGlmIChyZXYuZ2V0UGVlbGVkVHlwZSgpICE9IENvbnN0YW50cy5PQkpfQ09NTUlUCisgICAgICAgIHx8ICFwYXRoLmlzRW1wdHkoKQorICAgICAgICB8fCByZXN1bHQuZ2V0UmV2aXNpb24oKS5uYW1lSXNJZCgpKSB7CisgICAgICByZXR1cm4gQ01EX1NIT1c7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDTURfTE9HOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Zpc2liaWxpdHlDYWNoZS5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Zpc2liaWxpdHlDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTY5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVmlzaWJpbGl0eUNhY2hlLmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlcy5ub3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQ29sbGVjdGlvbnMyLmZpbHRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGVCdWlsZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZTb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKiBDYWNoZSBvZiBwZXItdXNlciBvYmplY3QgdmlzaWJpbGl0eS4gKi8KK3B1YmxpYyBjbGFzcyBWaXNpYmlsaXR5Q2FjaGUgeworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBLZXkgeworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHVzZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVwb3NpdG9yeU5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RJZCBvYmplY3RJZDsKKworICAgIHByaXZhdGUgS2V5KE9iamVjdCB1c2VyLCBTdHJpbmcgcmVwb3NpdG9yeU5hbWUsIE9iamVjdElkIG9iamVjdElkKSB7CisgICAgICB0aGlzLnVzZXIgPSBjaGVja05vdE51bGwodXNlciwgInVzZXIiKTsKKyAgICAgIHRoaXMucmVwb3NpdG9yeU5hbWUgPSBjaGVja05vdE51bGwocmVwb3NpdG9yeU5hbWUsICJyZXBvc2l0b3J5TmFtZSIpOworICAgICAgdGhpcy5vYmplY3RJZCA9IGNoZWNrTm90TnVsbChvYmplY3RJZCwgIm9iamVjdElkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIEtleSkgeworICAgICAgICBLZXkgayA9IChLZXkpIG87CisgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFsKHVzZXIsIGsudXNlcikKKyAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwocmVwb3NpdG9yeU5hbWUsIGsucmVwb3NpdG9yeU5hbWUpCisgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKG9iamVjdElkLCBrLm9iamVjdElkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUodXNlciwgcmVwb3NpdG9yeU5hbWUsIG9iamVjdElkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIE9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgICAgLmFkZCgidXNlciIsIHVzZXIpCisgICAgICAgIC5hZGQoInJlcG9zaXRvcnlOYW1lIiwgcmVwb3NpdG9yeU5hbWUpCisgICAgICAgIC5hZGQoIm9iamVjdElkIiwgb2JqZWN0SWQpCisgICAgICAgIC50b1N0cmluZygpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgQ2FjaGU8S2V5LCBCb29sZWFuPiBjYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHRvcG9Tb3J0OworCisgIHB1YmxpYyBzdGF0aWMgQ2FjaGVCdWlsZGVyPE9iamVjdCwgT2JqZWN0PiBuZXdCdWlsZGVyKCkgeworICAgIHJldHVybiBDYWNoZUJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgIC5tYXhpbXVtU2l6ZSgxIDw8IDEwKQorICAgICAgICAuZXhwaXJlQWZ0ZXJXcml0ZSgzMCwgVGltZVVuaXQuTUlOVVRFUyk7CisgIH0KKworICBwdWJsaWMgVmlzaWJpbGl0eUNhY2hlKGJvb2xlYW4gdG9wb1NvcnQpIHsKKyAgICB0aGlzKHRvcG9Tb3J0LCBuZXdCdWlsZGVyKCkpOworICB9CisKKyAgcHVibGljIFZpc2liaWxpdHlDYWNoZShib29sZWFuIHRvcG9Tb3J0LCBDYWNoZUJ1aWxkZXI8T2JqZWN0LCBPYmplY3Q+IGJ1aWxkZXIpIHsKKyAgICB0aGlzLmNhY2hlID0gYnVpbGRlci5idWlsZCgpOworICAgIHRoaXMudG9wb1NvcnQgPSB0b3BvU29ydDsKKyAgfQorCisgIHB1YmxpYyBDYWNoZTw/LCBCb29sZWFuPiBnZXRDYWNoZSgpIHsKKyAgICByZXR1cm4gY2FjaGU7CisgIH0KKworICBib29sZWFuIGlzVmlzaWJsZShmaW5hbCBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIFJldldhbGsgd2FsaywgR2l0aWxlc0FjY2VzcyBhY2Nlc3MsCisgICAgICBmaW5hbCBPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGNhY2hlLmdldCgKKyAgICAgICAgICBuZXcgS2V5KGFjY2Vzcy5nZXRVc2VyS2V5KCksIGFjY2Vzcy5nZXRSZXBvc2l0b3J5TmFtZSgpLCBpZCksCisgICAgICAgICAgbmV3IENhbGxhYmxlPEJvb2xlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBjYWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGlzVmlzaWJsZShyZXBvLCB3YWxrLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlSWZJbnN0YW5jZU9mKGUuZ2V0Q2F1c2UoKSwgSU9FeGNlcHRpb24uY2xhc3MpOworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGUoUmVwb3NpdG9yeSByZXBvLCBSZXZXYWxrIHdhbGssIE9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJldkNvbW1pdCBjb21taXQ7CisgICAgdHJ5IHsKKyAgICAgIGNvbW1pdCA9IHdhbGsucGFyc2VDb21taXQoaWQpOworICAgIH0gY2F0Y2ggKEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIElmIGFueSByZWZlcmVuY2UgZGlyZWN0bHkgcG9pbnRzIGF0IHRoZSByZXF1ZXN0ZWQgb2JqZWN0LCBwZXJtaXQgZGlzcGxheS4KKyAgICAvLyBDb21tb24gZm9yIGRpc3BsYXlzIG9mIHBlbmRpbmcgcGF0Y2ggc2V0cyBpbiBHZXJyaXQgQ29kZSBSZXZpZXcsIG9yCisgICAgLy8gYm9va21hcmtzIHRvIHRoZSBjb21taXQgYSB0YWcgcG9pbnRzIGF0LgorICAgIENvbGxlY3Rpb248UmVmPiBhbGxSZWZzID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKS52YWx1ZXMoKTsKKyAgICBmb3IgKFJlZiByZWYgOiBhbGxSZWZzKSB7CisgICAgICByZWYgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOworICAgICAgaWYgKGlkLmVxdWFscyhyZWYuZ2V0T2JqZWN0SWQoKSkgfHwgaWQuZXF1YWxzKHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBoZWFkcyBmaXJzdCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IG1vc3QgcmVxdWVzdHMgYXJlIGZvciByZWZzCisgICAgLy8gY2xvc2UgdG8gYSBoZWFkLiBUYWdzIHRlbmQgdG8gYmUgbXVjaCBmdXJ0aGVyIGJhY2sgaW4gaGlzdG9yeSBhbmQganVzdAorICAgIC8vIGNsdXR0ZXIgdXAgdGhlIHByaW9yaXR5IHF1ZXVlIGluIHRoZSBjb21tb24gY2FzZS4KKyAgICByZXR1cm4gaXNSZWFjaGFibGVGcm9tKHdhbGssIGNvbW1pdCwgZmlsdGVyKGFsbFJlZnMsIHJlZlN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKSkKKyAgICAgICAgfHwgaXNSZWFjaGFibGVGcm9tKHdhbGssIGNvbW1pdCwgZmlsdGVyKGFsbFJlZnMsIHJlZlN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfVEFHUykpKQorICAgICAgICB8fCBpc1JlYWNoYWJsZUZyb20od2FsaywgY29tbWl0LCBmaWx0ZXIoYWxsUmVmcywgbm90KHJlZlN0YXJ0c1dpdGgoInJlZnMvY2hhbmdlcy8iKSkpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFByZWRpY2F0ZTxSZWY+IHJlZlN0YXJ0c1dpdGgoZmluYWwgU3RyaW5nIHByZWZpeCkgeworICAgIHJldHVybiBuZXcgUHJlZGljYXRlPFJlZj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGFwcGx5KFJlZiByZWYpIHsKKyAgICAgICAgcmV0dXJuIHJlZi5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaXNSZWFjaGFibGVGcm9tKFJldldhbGsgd2FsaywgUmV2Q29tbWl0IGNvbW1pdCwgQ29sbGVjdGlvbjxSZWY+IHJlZnMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdhbGsucmVzZXQoKTsKKyAgICBpZiAodG9wb1NvcnQpIHsKKyAgICAgIHdhbGsuc29ydChSZXZTb3J0LlRPUE8pOworICAgIH0KKyAgICB3YWxrLm1hcmtTdGFydChjb21taXQpOworICAgIGZvciAoUmVmIHJlZiA6IHJlZnMpIHsKKyAgICAgIGlmIChyZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKSB7CisgICAgICAgIG1hcmtVbmludGVyZXN0aW5nKHdhbGssIHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hcmtVbmludGVyZXN0aW5nKHdhbGssIHJlZi5nZXRPYmplY3RJZCgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgdGhlIGNvbW1pdCBpcyByZWFjaGFibGUgZnJvbSBhbnkgYnJhbmNoIGhlYWQsIGl0IHdpbGwgYXBwZWFyIHRvIGJlCisgICAgLy8gdW5pbnRlcmVzdGluZyB0byB0aGUgUmV2V2FsayBhbmQgbm8gb3V0cHV0IHdpbGwgYmUgcHJvZHVjZWQuCisgICAgcmV0dXJuIHdhbGsubmV4dCgpID09IG51bGw7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIG1hcmtVbmludGVyZXN0aW5nKFJldldhbGsgd2FsaywgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHdhbGsubWFya1VuaW50ZXJlc3Rpbmcod2Fsay5wYXJzZUNvbW1pdChpZCkpOworICAgIH0gY2F0Y2ggKEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgLy8gRG8gbm90aGluZywgZG9lc24ndCBhZmZlY3QgcmVhY2hhYmlsaXR5LgorICAgIH0gY2F0Y2ggKE1pc3NpbmdPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgLy8gRG8gbm90aGluZywgZG9lc24ndCBhZmZlY3QgcmVhY2hhYmlsaXR5LgorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL2dpdGlsZXMuY3NzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL2dpdGlsZXMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTc1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvZ2l0aWxlcy5jc3MKQEAgLTAsMCArMSwzMTkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBDb21tb24gc3R5bGVzIGFuZCBkZWZpbml0aW9ucy4gKi8KKworaDEgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogMDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgbWFyZ2luLXRvcDogNXB4OworfQorLm1lbnUgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogMDsKKyAgcmlnaHQ6IDA7CisgIGZvbnQtc2l6ZTogMTBwdDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIG1hcmdpbi10b3A6IDVweDsKKyAgbWFyZ2luLXJpZ2h0OiA1cHg7Cit9CisubWVudSAuZW50cnkgeworICBwYWRkaW5nLXJpZ2h0OiA1cHg7CisgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIGJsYWNrOworICBtYXJnaW4tcmlnaHQ6IDA7Cit9CitoMiB7CisgIG1hcmdpbi10b3A6IDNlbTsKK30KKy5icmVhZGNydW1icyB7CisgIG1hcmdpbi10b3A6IDNlbTsKKyAgZm9udC1zaXplOiAxNTAlOworICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCit9Cit0YWJsZS5saXN0IHsKKyAgbWFyZ2luLXRvcDogMWVtOworICB3aWR0aDogOTAlOworfQordGFibGUubGlzdCB0ci5uby1ob3Zlcjpob3ZlciB7CisgIGJhY2tncm91bmQ6ICNmZmY7Cit9Cit0YWJsZS5saXN0IHRyOmhvdmVyLCBvbC5saXN0IGxpOmhvdmVyLCBwcmUucHJldHR5cHJpbnQgbGk6aG92ZXIgeworICBiYWNrZ3JvdW5kOiAjZWVlOyAvKiBIT1ZFUl9CQUNLR1JPVU5EICovCit9Cit0YWJsZS5saXN0IHRkIHsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgcGFkZGluZy10b3A6IDAuMjVlbTsKKyAgcGFkZGluZy1ib3R0b206IDAuMjVlbTsKK30KKy5sb2ctbGluayB7CisgIG1hcmdpbi1sZWZ0OiAwLjVlbQorfQorCisKKy8qIFN0eWxlcyBmb3IgdGhlIGhvc3QgaW5kZXggcGFnZS4gKi8KKworLmluc3RydWN0aW9ucyB7CisgIHdpZHRoOiA0NWVtOworICBtYXJnaW4tbGVmdDogMWVtOworICBtYXJnaW4tcmlnaHQ6IDFlbTsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM1NTU7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNTU1OworICBjb2xvcjogIzU1NTsKK30KKy5pbnN0cnVjdGlvbnMgcHJlIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzA2MDsKKyAgcGFkZGluZy1sZWZ0OiAxZW07CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisuZm9vdGVyIHsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIGJhY2tncm91bmQ6ICNlZWU7CisgIHBhZGRpbmctcmlnaHQ6IDFlbTsKKyAgd2lkdGg6IDkwJTsKK30KKy5mb290ZXIgYSB7CisgIGNvbG9yOiBibGFjazsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGZvbnQtc2l6ZTogNzAlOworfQorCisKKy8qIFN0eWxlcyBmb3IgdGhlIHJlcG9zaXRvcnkgaW5kZXggcGFnZS4gKi8KKworLnJlcG9zaXRvcnktZGVzY3JpcHRpb24geworICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCisgIHBhZGRpbmctYm90dG9tOiA1cHg7IC8qIFZQQURESU5HICovCit9CisucmVwb3NpdG9yeS1yZWZzIHsKKyAgd2lkdGg6IDQ1MHB4OworfQorLnJlcG9zaXRvcnktYnJhbmNoZXMgeworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDIwMHB4OworfQorLnJlcG9zaXRvcnktdGFncyB7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDI1MHB4OworfQorLmNsb25lLWxpbmUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVlY2Y5OyAvKiBCT1hfQkFDS0dST1VORCAqLworICBib3JkZXI6IG5vbmU7CisgIG1hcmdpbjogNXB4IC8qIFZQQURESU5HICovIDAgMCAwOworICBwYWRkaW5nOiA1cHggMmVtOyAvKiBQQURESU5HICovCisgIGZvbnQtc2l6ZTogOXB0OworfQorCisKKy8qIFN0eWxlcyBmb3IgdGhlIG9iamVjdCBkZXRhaWwgdGVtcGxhdGVzLiAqLworCisuc2hhMSB7CisgIGNvbG9yOiAjNjY2OworICBmb250LXNpemU6IDlwdDsKK30KK2Rpdi5zaGExIHsKKyAgcGFkZGluZy10b3A6IDVweDsgLyogVlBBRERJTkcgKi8KK30KKworLmdpdC1jb21taXQsIC5naXQtdGFnIHsKKyAgZm9udC1zaXplOiA5cHQ7CisgIGJvcmRlci1ib3R0b206ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KKyAgcGFkZGluZzogNXB4IDJlbTsgLyogUEFERElORyAqLworfQorLmdpdC1jb21taXQgdGFibGUsIC5naXQtdGFnIHRhYmxlIHsKKyAgbWFyZ2luOiAwOworfQorLmdpdC1jb21taXQgdGFibGUgdGgsIC5naXQtdGFnIHRhYmxlIHRoIHsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CitwcmUuY29tbWl0LW1lc3NhZ2UsIHByZS50YWctbWVzc2FnZSB7CisgIGJvcmRlci1ib3R0b206ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KKyAgcGFkZGluZzogNXB4IDJlbTsgLyogUEFERElORyAqLworICBjb2xvcjogIzAwMDsKKyAgZm9udC1zaXplOiA5cHQ7CisgIG1hcmdpbjogMDsKK30KKwordWwuZGlmZi10cmVlIHsKKyAgZm9udC1zaXplOiA5cHQ7CisgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiA1cHggMmVtOyAvKiBQQURESU5HICovCit9Cit1bC5kaWZmLXRyZWUgLmFkZCB7CisgIGNvbG9yOiAjMDYwOworfQordWwuZGlmZi10cmVlIC5kZWxldGUgeworICBjb2xvcjogIzYwMDsKK30KK3VsLmRpZmYtdHJlZSAucmVuYW1lLCB1bC5kaWZmLXRyZWUgLmNvcHkgeworICBjb2xvcjogIzAwNjsKK30KK3NwYW4uZGlmZi1saW5rLCB1bC5kaWZmLXRyZWUgLmFkZCwgdWwuZGlmZi10cmVlIC5tb2RpZnksIHVsLmRpZmYtdHJlZSAuZGVsZXRlLAorICAgIHVsLmRpZmYtdHJlZSAucmVuYW1lLCB1bC5kaWZmLXRyZWUgLmNvcHkgeworICBtYXJnaW4tbGVmdDogMC41ZW07Cit9CisuZGlmZi1zdW1tYXJ5IHsKKyAgZm9udC1zaXplOiA5cHQ7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgcGFkZGluZzogNXB4IDJlbTsgLyogUEFERElORyAqLworICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCit9CisKK29sLmZpbGVzIHsKKyAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICBtYXJnaW4tbGVmdDogMWVtOworICBmb250LXNpemU6IDEwcHQ7CisgIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cit9CisKKy8qIFRyZWUgaWNvbnMgYXJlIHRha2VuIGZyb20gdGhlIHB1YmxpYyBkb21haW4gQXBhY2hlIHN0YW5kYXJkIGljb25zOgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2ljb25zLyAqLworb2wuZmlsZXMgbGkuZ2l0LXRyZWV7CisgIC8qIHNtYWxsL2ZvbGRlci5wbmcgKi8KKyAgbGlzdC1zdHlsZS1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFCbUpMUjBRQUFBQUFBQUQ1UTd0L0FBQUFDWEJJV1hNQUFBQklBQUFBU0FCR3lXcytBQUFBQ1had1FXY0FBQUFRQUFBQUVBQmN4cTNEQUFBQStrbEVRVlE0eTYzVE1XdkNRQmpHOGY4citSb3VSU2U3T05jaHVDVFFzWlM2Rk5MQlNRcmRpMVBtRmhjbmh3cE9Vam9LM2lJdlJXY2RuUDBxMTZGY1NPU2lqZlNaamh0K1BOeTlyNmdxQUdFWVdnQlZGU3BFQU50cTFubDdUUUNJazVROGRBNE9BUFpteEhYMEFzQnlPaXcwV2s2SFJKMDIwdkJEQWxoNytNb3VIT1FhdVVTZE5tYTlKVTdTQWhJY1Y5cWJrUmN5NjYzM0RRSktVZ2I5R1RpRzVPb3VlNTk4YXVjQUFQTzlBK0RqYzNVWmNDci9BL1NlMzdPYWxRRlZsZmxpUTV5a0YwRTErSjJ1S3RDZy8yamR1ZkNOK2ZtZkx6WTgzTjd3ZE44dFJjYVRtWGpud0FlVlJkdzZuNHBiTElCV3N3N0FlRElUZ0IvT1RIRWZGM0c2b0FBQUFBQkpSVTVFcmtKZ2dnPT0pOworfQorb2wuZmlsZXMgbGkuc3ltbGlua3sKKyAgLyogc21hbGwvZm9yd2FyZC5wbmcgKi8KKyAgbGlzdC1zdHlsZS1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBUUFBQUMxK2pmcUFBQUFBbUpMUjBRQUFLcU5JeklBQUFBSmNFaFpjd0FBQUVnQUFBQklBRWJKYXo0QUFBQUpkbkJCWndBQUFCQUFBQUFRQUZ6R3JjTUFBQUN0U1VSQlZDalBmWkd4RVlNd0RFV2ZmTlRzd0FwY0dzK1JZNEtVdERTWmdJYldKUk53V1NIbmppYkhDdGtoQ3lpRkRZWUUrS3JrLzAvUzl4ZFBRcTRmNFFmWnV1a3BGQzZ5STNqcEl6NFVleFB1eWlGTXJzTUpEZWJKT2N3Yng1V1NNbDRRVHN5WHFWa0JORmlnNUFhZ3dVKzFkVEVDSTQ0NnVuQk0yZ2E3blhKUVZqMGVQUFdweEVBbEhmYlFoZmdsZzBFbnhoVmxhU1VLNXFoZy9wVW0waHRCa2tGUEphc1YvMGpCZndIc2RrbzlrVUNvTXdBQUFBQkpSVTVFcmtKZ2dnPT0pOworfQorb2wuZmlsZXMgbGkucmVndWxhci1maWxleworICAvKiBzbWFsbC90ZXh0LnBuZyAqLworICBsaXN0LXN0eWxlLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FRQUFBQzEramZxQUFBQUFtSkxSMFFBQUtxTkl6SUFBQUFKY0VoWmN3QUFBRWdBQUFCSUFFYkphejRBQUFBSmRuQkJad0FBQUJBQUFBQVFBRnpHcmNNQUFBQ0RTVVJCVkNqUFl6ekFnQjh3b1F1YytZL0taenozM3hDSmU1NUJrbUVwZ3drakhoTWtHS0pSVE1GUWNKN2hPWU1KSTBJSkN3TURBNE1WWFBvWWhQMmZnY0VFV2NFNkpCT09NUnhrWkdCWWpXcENFSkkwQTRQOS94ZElHdEJNZU1IQXdDREJJSUd1SUlnQkZSekRiUUltb0pjSngvQ1o4SW14OS85OURPRnpES0ZRRmdCajZ5R3dodEV6T3dBQUFBQkpSVTVFcmtKZ2dnPT0pCit9CitvbC5maWxlcyBsaS5leGVjdXRhYmxlLWZpbGV7CisgIC8qIHNtYWxsL3BhdGNoLnBuZyAqLworICBsaXN0LXN0eWxlLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FRQUFBQzEramZxQUFBQUFtSkxSMFFBLzRlUHpMOEFBQUFKY0VoWmN3QUFBRWdBQUFCSUFFYkphejRBQUFBSmRuQkJad0FBQUJBQUFBQVFBRnpHcmNNQUFBQ0RTVVJCVkNqUGxZK3hEWU13RUVXL0k0YWdaWVJRc2dvamtDNFpBenAyb2pNanVQUVlqd0pFY3ZnU0tWK3l6cktlbnY5Si8yYms4aEQ1VENSamtkdlZVS3MzbGdKWWxmVUtieVJFN2dib2pya0V0d09BSkExOC9VS0M3SFdZanJNWExZQkpTUStsRXltQXAreDBESFk2aGthekdzZmdyQW53YzAyYnFnMGpxZlNldHcyajdsY2g3VFp2ZlFBQUFDUjBSVmgwWTI5dGJXVnVkQUJpZVNCTllYSjBhVzR1UzNKaFpXMWxja0JOWTJndVUwNUpMa1JsYUNQRjZRQUFBQUJKUlU1RXJrSmdnZz09KTsKK30KK29sLmZpbGVzIGxpLmdpdGxpbmt7CisgIC8qIHNtYWxsL2NvbnRpbnVlZC5wbmcgKi8KKyAgbGlzdC1zdHlsZS1pbWFnZTp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FRQUFBQzEramZxQUFBQUFtSkxSMFFBQUtxTkl6SUFBQUFKY0VoWmN3QUFBRWdBQUFCSUFFYkphejRBQUFBSmRuQkJad0FBQUJBQUFBQVFBRnpHcmNNQUFBQ1BTVVJCVkNqUHpkQ3hiY05BRklQaDd3UXZrVElqQkVqajFpc2NYR1VTVFpER0xqVkNLdUZXQ0s1TGMvQUtHb1VwcE5xMVdmMThJQjRJbHU2NUppOFNtRE95MnpuelFlT2dpVG1MWm9RMVZiV0drV1l4aDJtayt2QmRHaDYrWER6UUxONVVJeWMyZDl2eCtBZC80QmROcFR0SHpybWx1MFVjdEYrNzBySG0zV2VCTlZ6TFhuSnpMZmJBS3l6NVRQL3Jla0dLNVByWmZnQUFBQUJKUlU1RXJrSmdnZz09KTsKK30KKworCisvKiBTdHlsZXMgZm9yIHRoZSBwYXRoIGRldGFpbCBwYWdlLiAqLworCisuc3ltbGluay1kZXRhaWwsIC5naXRsaW5rLWRldGFpbCB7CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIGNvbG9yOiAjNjY2OworICBmb250LXN0eWxlOiBpdGFsaWM7CisgIGZvbnQtc2l6ZTogMTBwdDsKK30KKworCisvKiBTdHlsZXMgZm9yIHRoZSBsb2cgZGV0YWlsIHBhZ2UuICovCisKK29sLnNob3J0bG9nIHsKKyAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDVweCAyZW07IC8qIFBBRERJTkcgKi8KK30KK29sLnNob3J0bG9nIGxpIHsKKyAgYm9yZGVyLWJvdHRvbTogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworICBwYWRkaW5nLXRvcDogMnB4OworICBwYWRkaW5nLWJvdHRvbTogMnB4OworfQorb2wuc2hvcnRsb2cgbGkuZmlyc3QgeworICBib3JkZXItdG9wOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCit9CitvbC5zaG9ydGxvZyBsaTpob3ZlciB7CisgIGJhY2tncm91bmQ6ICNlZWU7IC8qIEhPVkVSX0JBQ0tHUk9VTkQgKi8KK30KK29sLnNob3J0bG9nIC5zaGExIHsKKyAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKy5sb2ctbmF2IHsKKyAgbWFyZ2luLXRvcDogNXB4OworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisuYXV0aG9yIHsKKyAgcGFkZGluZy1sZWZ0OiAzcHg7Cit9CisudGltZSB7CisgIGZvbnQtc2l6ZTogOXB0OyAvKiBTSE9SVExPR19TTUFMTF9GT05UX1NJWkUgKi8KKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorLmJyYW5jaC1sYWJlbCwgLnRhZy1sYWJlbCB7CisgIGZvbnQtc2l6ZTogOXB0OyAvKiBTSE9SVExPR19TTUFMTF9GT05UX1NJWkUgKi8KKyAgbWFyZ2luLWxlZnQ6IDNweDsKK30KK2EuYnJhbmNoLWxhYmVsIHsKKyAgY29sb3I6ICNkZDRiMzk7Cit9CithLnRhZy1sYWJlbCB7CisgIGNvbG9yOiAjMDA5OTMzOworfQorCisKKy8qIFN0eWxlcyBmb3IgdGhlIGRpZmYgZGV0YWlsIHRlbXBsYXRlLiAqLworCisuZGlmZi1oZWFkZXIgeworfQorLmRpZmYtZ2l0IHsKKyAgY29sb3I6ICM0NDQ7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorYS5kaWZmLWdpdDpob3ZlciB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKy5kaWZmLWhlYWRlciwgLmRpZmYtdW5pZmllZCB7CisgIGNvbG9yOiAjMDAwOworICBmb250LXNpemU6IDlwdDsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nLWxlZnQ6IDJlbTsKK30KKy5kaWZmLXVuaWZpZWQgeworICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDsgLyogQk9SREVSICovCit9CisuZGlmZi11bmlmaWVkIC5oIHsKKyAgY29sb3I6IGRhcmtibHVlOworfQorLmRpZmYtdW5pZmllZCAuZCB7CisgIGNvbG9yOiBkYXJrcmVkOworfQorLmRpZmYtdW5pZmllZCAuaSB7CisgIGNvbG9yOiBkYXJrZ3JlZW47Cit9CisKKworLyogT3ZlcnJpZGUgc29tZSBzdHlsZXMgZnJvbSB0aGUgZGVmYXVsdCBwcmV0dGlmeS5jc3MuICovCisKKy8qIExpbmUgbnVtYmVycyBvbiBhbGwgbGluZXMuICovCitsaS5MMCwgbGkuTDEsIGxpLkwyLCBsaS5MMywgbGkuTDQsIGxpLkw1LCBsaS5MNiwgbGkuTDcsIGxpLkw4LCBsaS5MOSB7CisgIGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsKK30KKworLyogRGlzYWJsZSBhbHRlcm5hdGluZyBsaW5lIGJhY2tncm91bmQgY29sb3IuICovCitsaS5MMCwgbGkuTDEsIGxpLkwyLCBsaS5MMywgbGkuTDQsIGxpLkw1LCBsaS5MNiwgbGkuTDcsIGxpLkw4LCBsaS5MOSB7CisgIGJhY2tncm91bmQ6ICNmZmY7Cit9CisKK3ByZS5naXQtYmxvYiB7CisgIGJvcmRlci10b3A6ICNkZGQgc29saWQgMXB4OyAvKiBCT1JERVIgKi8KKyAgYm9yZGVyLWJvdHRvbTogI2RkZCBzb2xpZCAxcHg7IC8qIEJPUkRFUiAqLworICBib3JkZXItbGVmdDogbm9uZTsKKyAgYm9yZGVyLXJpZ2h0OiBub25lOworICBwYWRkaW5nLWxlZnQ6IDFlbTsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKKyAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKyAgZm9udC1zaXplOiA4cHQ7Cit9CitwcmUucHJldHR5cHJpbnQgb2wgeworICBjb2xvcjogZ3JleTsKK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9DT1BZSU5HIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhNDFjMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9DT1BZSU5HCkBAIC0wLDAgKzEsMjE0IEBACitnb29nbGUtY29kZS1wcmV0dGlmeSBkb3dubG9hZGVkIGZyb206CitodHRwOi8vZ29vZ2xlLWNvZGUtcHJldHRpZnkuZ29vZ2xlY29kZS5jb20vZmlsZXMvcHJldHRpZnktc21hbGwtMS1KdW4tMjAxMS50YXIuYnoyCisKK0FsbCBmaWxlcyB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzOgorcHJldHRpZnkuanM6IENvcHlyaWdodCAoQykgMjAwNiBHb29nbGUgSW5jLgorbGFuZy1hcG9sbG8uanM6IENvcHlyaWdodCAoQykgMjAwOSBPbm5vIEhvbW1lcy4KK2xhbmctY2xqLmpzOiAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorbGFuZy1jc3MuanM6IENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorbGFuZy1nby5qczogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCitsYW5nLWhzLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KK2xhbmctbGlzcC5qczogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCitsYW5nLWx1YS5qczogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCitsYW5nLW1sLmpzOiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KK2xhbmctbi5qczogQ29weXJpZ2h0IChDKSAyMDExIFppbWluIEEuVi4KK2xhbmctcHJvdG8uanM6IENvcHlyaWdodCAoQykgMjAwNiBHb29nbGUgSW5jLgorbGFuZy1zY2FsYS5qczogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCitsYW5nLXNxbC5qczogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCitsYW5nLXRleC5qczogQ29weXJpZ2h0IChDKSAyMDExIE1hcnRpbiBTLgorbGFuZy12Yi5qczogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCitsYW5nLXdpa2kuanM6IENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorbGFuZy14cS5qczogQ29weXJpZ2h0IChDKSAyMDExIFBhdHJpY2sgV2llZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBDb3B5cmlnaHQgMjAxMSBNaWtlIFNhbXVlbCBldCBhbAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctYXBvbGxvLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctYXBvbGxvLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOThiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1hcG9sbG8uanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbImNvbSIsL14jW15cblxyXSovLG51bGwsIiMiXSxbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl0sWyJzdHIiLC9eIig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKS8sbnVsbCwnIiddXSxbWyJrd2QiLC9eKD86QURTfEFEfEFVR3xCWkZ8QlpNRnxDQUV8Q0FGfENBfENDU3xDT018Q1N8REFTfERDQXxEQ09NfERDU3xERE9VQkx8RElNfERPVUJMRXxEVENCfERUQ0Z8RFZ8RFhDSHxFRFJVUFR8RVhURU5EfElOQ1J8SU5ERVh8TkRYfElOSElOVHxMWENIfE1BU0t8TVNLfE1QfE1TVXxOT09QfE9WU0t8UVhDSHxSQU5EfFJFQUR8UkVMSU5UfFJFU1VNRXxSRVRVUk58Uk9SfFJYT1J8U1FVQVJFfFNVfFRDUnxUQ0FBfE9WU0t8VENGfFRDfFRTfFdBTkR8V09SfFdSSVRFfFhDSHxYTFF8WFhBTFF8Wkx8WlF8QUREfEFEWnxTVUJ8U1VafE1QWXxNUFJ8TVBafERWUHxDT018QUJTfENMQXxDTFp8TERRfFNUT3xTVFF8QUxTfExMU3xMUlN8VFJBfFRTUXxUTUl8VE9WfEFYVHxUSVh8RExZfElOUHxPVVQpXHMvLAorbnVsbF0sWyJ0eXAiLC9eKD86LT9HRU5BRFJ8PU1JTlVTfDJCQ0FEUnxWTnxCT0Z8TU18LT8yQ0FEUnwtP1sxLTZdRE5BRFJ8QURSRVN8QkJDT058W0VTXT9CQU5LPT98QkxPQ0t8Qk5LU1VNfEU/Q0FEUnxDT1VOVFwqP3wyP0RFQ1wqP3wtP0ROQ0hBTnwtP0ROUFRSfEVRVUFMU3xFUkFTRXxNRU1PUll8Mj9PQ1R8UkVNQURSfFNFVExPQ3xTVUJST3xPUkd8QlNTfEJFU3xTWU58RVFVfERFRklORXxFTkQpXHMvLG51bGxdLFsibGl0IiwvXicoPzotKig/Olx3fFxcWyEtfl0pKD86W1x3LV0qfFxcWyEtfl0pWyE9P10/KT8vXSxbInBsbiIsL14tKig/OlshLXpdfFxcWyEtfl0pKD86W1x3LV0qfFxcWyEtfl0pWyE9P10/L10sWyJwdW4iLC9eW15cd1x0XG5cciAiJy0pO1xcXHhhMF0rL11dKSxbImFwb2xsbyIsImFnYyIsImFlYSJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWNsai5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWNsai5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJhMjIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctY2xqLmpzCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisKKyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCit2YXIgYT1udWxsOworUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJvcG4iLC9eWyhbe10rLyxhLCIoW3siXSxbImNsbyIsL15bKVxdfV0rLyxhLCIpXX0iXSxbImNvbSIsL147W15cblxyXSovLGEsIjsiXSxbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sYSwiXHRcblxyIFx4YTAiXSxbInN0ciIsL14iKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpLyxhLCciJ11dLFtbImt3ZCIsL14oPzpkZWZ8aWZ8ZG98bGV0fHF1b3RlfHZhcnxmbnxsb29wfHJlY3VyfHRocm93fHRyeXxtb25pdG9yLWVudGVyfG1vbml0b3ItZXhpdHxkZWZtYWNyb3xkZWZufGRlZm4tfG1hY3JvZXhwYW5kfG1hY3JvZXhwYW5kLTF8Zm9yfGRvc2VxfGRvc3luY3xkb3RpbWVzfGFuZHxvcnx3aGVufG5vdHxhc3NlcnR8ZG90b3xwcm94eXxkZWZzdHJ1Y3R8Zmlyc3R8cmVzdHxjb25zfGRlZnByb3RvY29sfGRlZnR5cGV8ZGVmcmVjb3JkfHJlaWZ5fGRlZm11bHRpfGRlZm1ldGhvZHxtZXRhfHdpdGgtbWV0YXxuc3xpbi1uc3xjcmVhdGUtbnN8aW1wb3J0fGludGVybnxyZWZlcnxhbGlhc3xuYW1lc3BhY2V8cmVzb2x2ZXxyZWZ8ZGVyZWZ8cmVmc2V0fG5ld3xzZXQhfG1lbWZufHRvLWFycmF5fGludG8tYXJyYXl8YXNldHxnZW4tY2xhc3N8cmVkdWNlfG1hcHxmaWx0ZXJ8ZmluZHxuaWw/fGVtcHR5P3xoYXNoLW1hcHxoYXNoLXNldHx2ZWN8dmVjdG9yfHNlcXxmbGF0dGVufHJldmVyc2V8YXNzb2N8ZGlzc29jfGxpc3R8bGlzdD98ZGlzanxnZXR8dW5pb258ZGlmZmVyZW5jZXxpbnRlcnNlY3Rpb258ZXh0ZW5kfGV4dGVuZC10eXBlfGV4dGVuZC1wcm90b2NvbHxwcm4pXGIvLGFdLAorWyJ0eXAiLC9eOltcZEEtWmEtei1dKy9dXSksWyJjbGoiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1jc3MuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1jc3MuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxZTFmNQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWNzcy5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXGZcciBdKy8sbnVsbCwiIFx0XHJcbgwiXV0sW1sic3RyIiwvXiIoPzpbXlxuXGZcciJcXF18XFwoPzpcclxuP3xcbnxcZil8XFxbXFNcc10pKiIvLG51bGxdLFsic3RyIiwvXicoPzpbXlxuXGZccidcXF18XFwoPzpcclxuP3xcbnxcZil8XFxbXFNcc10pKicvLG51bGxdLFsibGFuZy1jc3Mtc3RyIiwvXnVybFwoKFteIicpXSopXCkvaV0sWyJrd2QiLC9eKD86dXJsfHJnYnwhaW1wb3J0YW50fEBpbXBvcnR8QHBhZ2V8QG1lZGlhfEBjaGFyc2V0fGluaGVyaXQpKD89W15cdy1dfCQpL2ksbnVsbF0sWyJsYW5nLWNzcy1rdyIsL14oLT8oPzpbX2Etel18XFxbXGRhLWZdKyA/KSg/Oltcdy1dfFxcXFxbXGRhLWZdKyA/KSopXHMqOi9pXSxbImNvbSIsL15cL1wqW14qXSpcKisoPzpbXiovXVteKl0qXCorKSpcLy9dLFsiY29tIiwKKy9eKD86PFwhLS18LS1cPikvXSxbImxpdCIsL14oPzpcZCt8XGQqXC5cZCspKD86JXxbYS16XSspPy9pXSxbImxpdCIsL14jW1xkYS1mXXszLDZ9L2ldLFsicGxuIiwvXi0/KD86W19hLXpdfFxcW1xkYS1mXSsgPykoPzpbXHctXXxcXFxcW1xkYS1mXSsgPykqL2ldLFsicHVuIiwvXlteXHNcdyInXSsvXV0pLFsiY3NzIl0pO1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW10sW1sia3dkIiwvXi0/KD86W19hLXpdfFxcW1xkYS1mXSsgPykoPzpbXHctXXxcXFxcW1xkYS1mXSsgPykqL2ldXSksWyJjc3Mta3ciXSk7UFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbXSxbWyJzdHIiLC9eW14iJyldKy9dXSksWyJjc3Mtc3RyIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctZ28uanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1nby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzE4ZGMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctZ28uanMKQEAgLTAsMCArMSBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciDCXHhhMCJdLFsicGxuIiwvXig/OiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCl8Jyg/OlteJ1xcXXxcXFtcU1xzXSkrKD86J3wkKXxgW15gXSooPzpgfCQpKS8sbnVsbCwiXCInIl1dLFtbImNvbSIsL14oPzpcL1wvW15cblxyXSp8XC9cKltcU1xzXSo/XCpcLykvXSxbInBsbiIsL14oPzpbXiInL2BdfFwvKD8hWyovXSkpKy9dXSksWyJnbyJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWhzLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctaHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3N2IwOAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWhzLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0LVxyIF0rLyxudWxsLCJcdFxuCwxcciAiXSxbInN0ciIsL14iKD86W15cblxmXHIiXFxdfFxcW1xTXHNdKSooPzoifCQpLyxudWxsLCciJ10sWyJzdHIiLC9eJyg/OlteXG5cZlxyJ1xcXXxcXFteJl0pJz8vLG51bGwsIiciXSxbImxpdCIsL14oPzowb1swLTddK3wweFtcZGEtZl0rfFxkKyg/OlwuXGQrKT8oPzplWystXT9cZCspPykvaSxudWxsLCIwMTIzNDU2Nzg5Il1dLFtbImNvbSIsL14oPzotLStbXlxuXGZccl0qfHstKD86W14tXXwtK1tefS1dKSotfSkvXSxbImt3ZCIsL14oPzpjYXNlfGNsYXNzfGRhdGF8ZGVmYXVsdHxkZXJpdmluZ3xkb3xlbHNlfGlmfGltcG9ydHxpbnxpbmZpeHxpbmZpeGx8aW5maXhyfGluc3RhbmNlfGxldHxtb2R1bGV8bmV3dHlwZXxvZnx0aGVufHR5cGV8d2hlcmV8XykoPz1bXlxkJ0EtWmEtel18JCkvLAorbnVsbF0sWyJwbG4iLC9eKD86W0EtWl1bXHcnXSpcLikqW0EtWmEtel1bXHcnXSovXSxbInB1biIsL15bXlxkXHQtXHIgIidBLVphLXpdKy9dXSksWyJocyJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWxpc3AuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1saXNwLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTMwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1saXNwLmpzCkBAIC0wLDAgKzEsMyBAQAordmFyIGE9bnVsbDsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sib3BuIiwvXlwoKy8sYSwiKCJdLFsiY2xvIiwvXlwpKy8sYSwiKSJdLFsiY29tIiwvXjtbXlxuXHJdKi8sYSwiOyJdLFsicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxhLCJcdFxuXHIgXHhhMCJdLFsic3RyIiwvXiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkvLGEsJyInXV0sW1sia3dkIiwvXig/OmJsb2NrfGNbYWRdK3J8Y2F0Y2h8Y29uW2RzXXxkZWYoPzppbmV8dW4pfGRvfGVxfGVxbHxlcXVhbHxlcXVhbHB8ZXZhbC13aGVufGZsZXR8Zm9ybWF0fGdvfGlmfGxhYmVsc3xsYW1iZGF8bGV0fGxvYWQtdGltZS12YWx1ZXxsb2NhbGx5fG1hY3JvbGV0fG11bHRpcGxlLXZhbHVlLWNhbGx8bmlsfHByb2dufHByb2d2fHF1b3RlfHJlcXVpcmV8cmV0dXJuLWZyb218c2V0cXxzeW1ib2wtbWFjcm9sZXR8dHx0YWdib2R5fHRoZXx0aHJvd3x1bndpbmQpXGIvLGFdLAorWyJsaXQiLC9eWystXT8oPzpbIzBdeFtcZGEtZl0rfFxkK1wvXGQrfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86W2RlXVsrLV0/XGQrKT8pL2ldLFsibGl0IiwvXicoPzotKig/Olx3fFxcWyEtfl0pKD86W1x3LV0qfFxcWyEtfl0pWyE9P10/KT8vXSxbInBsbiIsL14tKig/OltfYS16XXxcXFshLX5dKSg/Oltcdy1dKnxcXFshLX5dKVshPT9dPy9pXSxbInB1biIsL15bXlx3XHRcblxyICInLSk7XFxceGEwXSsvXV0pLFsiY2wiLCJlbCIsImxpc3AiLCJzY20iXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1sdWEuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1sdWEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzYTNjNAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLWx1YS5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbInN0ciIsL14oPzoiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfCcoPzpbXidcXF18XFxbXFNcc10pKig/Oid8JCkpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXi0tKD86XFsoPSopXFtbXFNcc10qPyg/Ol1cMV18JCl8W15cblxyXSopL10sWyJzdHIiLC9eXFsoPSopXFtbXFNcc10qPyg/Ol1cMV18JCkvXSxbImt3ZCIsL14oPzphbmR8YnJlYWt8ZG98ZWxzZXxlbHNlaWZ8ZW5kfGZhbHNlfGZvcnxmdW5jdGlvbnxpZnxpbnxsb2NhbHxuaWx8bm90fG9yfHJlcGVhdHxyZXR1cm58dGhlbnx0cnVlfHVudGlsfHdoaWxlKVxiLyxudWxsXSxbImxpdCIsL15bKy1dPyg/OjB4W1xkYS1mXSt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzplWystXT9cZCspPykvaV0sCitbInBsbiIsL15bX2Etel1cdyovaV0sWyJwdW4iLC9eW15cd1x0XG5cciBceGEwXVteXHdcdFxuXHIgIicrPVx4YTAtXSovXV0pLFsibHVhIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbWwuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1tbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGYwMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbWwuanMKQEAgLTAsMCArMSwyIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIMJceGEwIl0sWyJjb20iLC9eIyg/OmlmW1x0XG5cciBceGEwXSsoPzpbJF9hLXpdW1x3J10qfGBgW15cdFxuXHJgXSooPzpgYHwkKSl8ZWxzZXxlbmRpZnxsaWdodCkvaSxudWxsLCIjIl0sWyJzdHIiLC9eKD86Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSg/Oid8JCkpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXig/OlwvXC9bXlxuXHJdKnxcKFwqW1xTXHNdKj9cKlwpKS9dLFsia3dkIiwvXig/OmFic3RyYWN0fGFuZHxhc3xhc3NlcnR8YmVnaW58Y2xhc3N8ZGVmYXVsdHxkZWxlZ2F0ZXxkb3xkb25lfGRvd25jYXN0fGRvd250b3xlbGlmfGVsc2V8ZW5kfGV4Y2VwdGlvbnxleHRlcm58ZmFsc2V8ZmluYWxseXxmb3J8ZnVufGZ1bmN0aW9ufGlmfGlufGluaGVyaXR8aW5saW5lfGludGVyZmFjZXxpbnRlcm5hbHxsYXp5fGxldHxtYXRjaHxtZW1iZXJ8bW9kdWxlfG11dGFibGV8bmFtZXNwYWNlfG5ld3xudWxsfG9mfG9wZW58b3J8b3ZlcnJpZGV8cHJpdmF0ZXxwdWJsaWN8cmVjfHJldHVybnxzdGF0aWN8c3RydWN0fHRoZW58dG98dHJ1ZXx0cnl8dHlwZXx1cGNhc3R8dXNlfHZhbHx2b2lkfHdoZW58d2hpbGV8d2l0aHx5aWVsZHxhc3J8bGFuZHxsb3J8bHNsfGxzcnxseG9yfG1vZHxzaWd8YXRvbWljfGJyZWFrfGNoZWNrZWR8Y29tcG9uZW50fGNvbnN0fGNvbnN0cmFpbnR8Y29uc3RydWN0b3J8Y29udGludWV8ZWFnZXJ8ZXZlbnR8ZXh0ZXJuYWx8Zml4ZWR8ZnVuY3RvcnxnbG9iYWx8aW5jbHVkZXxtZXRob2R8bWl4aW58b2JqZWN0fHBhcmFsbGVsfHByb2Nlc3N8cHJvdGVjdGVkfHB1cmV8c2VhbGVkfHRyYWl0fHZpcnR1YWx8dm9sYXRpbGUpXGIvXSwKK1sibGl0IiwvXlsrLV0/KD86MHhbXGRhLWZdK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbKy1dP1xkKyk/KS9pXSxbInBsbiIsL14oPzpbX2Etel1bXHcnXSpbISM/XT98YGBbXlx0XG5ccmBdKig/OmBgfCQpKS9pXSxbInB1biIsL15bXlx3XHRcblxyICInXHhhMF0rL11dKSxbImZzIiwibWwiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1uLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJlODViCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctbi5qcwpAQCAtMCwwICsxLDQgQEAKK3ZhciBhPW51bGw7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInN0ciIsL14oPzonKD86W15cblxyJ1xcXXxcXC4pKid8Iig/OlteXG5cciJcXF18XFwuKSooPzoifCQpKS8sYSwnIiddLFsiY29tIiwvXiMoPzooPzpkZWZpbmV8ZWxpZnxlbHNlfGVuZGlmfGVycm9yfGlmZGVmfGluY2x1ZGV8aWZuZGVmfGxpbmV8cHJhZ21hfHVuZGVmfHdhcm5pbmcpXGJ8W15cblxyXSopLyxhLCIjIl0sWyJwbG4iLC9eXHMrLyxhLCIgXHJcblx0XHhhMCJdXSxbWyJzdHIiLC9eQCIoPzpbXiJdfCIiKSooPzoifCQpLyxhXSxbInN0ciIsL148I1teIz5dKig/OiM+fCQpLyxhXSxbInN0ciIsL148KD86KD86KD86XC5cLlwvKSp8XC8/KSg/Oltcdy1dKyg/OlwvW1x3LV0rKSspP1tcdy1dK1wuaHxbYS16XVx3Kik+LyxhXSxbImNvbSIsL15cL1wvW15cblxyXSovLGFdLFsiY29tIiwvXlwvXCpbXFNcc10qPyg/OlwqXC98JCkvLAorYV0sWyJrd2QiLC9eKD86YWJzdHJhY3R8YW5kfGFzfGJhc2V8Y2F0Y2h8Y2xhc3N8ZGVmfGRlbGVnYXRlfGVudW18ZXZlbnR8ZXh0ZXJufGZhbHNlfGZpbmFsbHl8ZnVufGltcGxlbWVudHN8aW50ZXJmYWNlfGludGVybmFsfGlzfG1hY3JvfG1hdGNofG1hdGNoZXN8bW9kdWxlfG11dGFibGV8bmFtZXNwYWNlfG5ld3xudWxsfG91dHxvdmVycmlkZXxwYXJhbXN8cGFydGlhbHxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmVmfHNlYWxlZHxzdGF0aWN8c3RydWN0fHN5bnRheHx0aGlzfHRocm93fHRydWV8dHJ5fHR5cGV8dHlwZW9mfHVzaW5nfHZhcmlhbnR8dmlydHVhbHx2b2xhdGlsZXx3aGVufHdoZXJlfHdpdGh8YXNzZXJ0fGFzc2VydDJ8YXN5bmN8YnJlYWt8Y2hlY2tlZHxjb250aW51ZXxkb3xlbHNlfGVuc3VyZXN8Zm9yfGZvcmVhY2h8aWZ8bGF0ZXxsb2NrfG5ld3xub2xhdGV8b3RoZXJ3aXNlfHJlZ2V4cHxyZXBlYXR8cmVxdWlyZXN8cmV0dXJufHN1cnJvdW5kd2l0aHx1bmNoZWNrZWR8dW5sZXNzfHVzaW5nfHdoaWxlfHlpZWxkKVxiLywKK2FdLFsidHlwIiwvXig/OmFycmF5fGJvb2x8Ynl0ZXxjaGFyfGRlY2ltYWx8ZG91YmxlfGZsb2F0fGludHxsaXN0fGxvbmd8b2JqZWN0fHNieXRlfHNob3J0fHN0cmluZ3x1bG9uZ3x1aW50fHVmbG9hdHx1bG9uZ3x1c2hvcnR8dm9pZClcYi8sYV0sWyJsaXQiLC9eQFskX2Etel1bXHckQF0qL2ksYV0sWyJ0eXAiLC9eQFtBLVpdK1thLXpdW1x3JEBdKi8sYV0sWyJwbG4iLC9eJz9bJF9hLXpdW1x3JEBdKi9pLGFdLFsibGl0IiwvXig/OjB4W1xkYS1mXSt8KD86XGQoPzpfXGQrKSpcZCooPzpcLlxkKik/fFwuXGRcKykoPzplWystXT9cZCspPylbYS16XSovaSxhLCIwMTIzNDU2Nzg5Il0sWyJwdW4iLC9eLlteXHNcdyItJCcuL0BgXSovLGFdXSksWyJuIiwibmVtZXJsZSJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXByb3RvLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctcHJvdG8uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNmFkOAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXByb3RvLmpzCkBAIC0wLDAgKzEgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuc291cmNlRGVjb3JhdG9yKHtrZXl3b3JkczoiYnl0ZXMsZGVmYXVsdCxkb3VibGUsZW51bSxleHRlbmQsZXh0ZW5zaW9ucyxmYWxzZSxncm91cCxpbXBvcnQsbWF4LG1lc3NhZ2Usb3B0aW9uLG9wdGlvbmFsLHBhY2thZ2UscmVwZWF0ZWQscmVxdWlyZWQscmV0dXJucyxycGMsc2VydmljZSxzeW50YXgsdG8sdHJ1ZSIsdHlwZXM6L14oYm9vbHwoZG91YmxlfHM/Zml4ZWR8W3N1XT9pbnQpKDMyfDY0KXxmbG9hdHxzdHJpbmcpXGIvLGNTdHlsZUNvbW1lbnRzOiEwfSksWyJwcm90byJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXNjYWxhLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctc2NhbGEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkMDM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXNjYWxhLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciDCXHhhMCJdLFsic3RyIiwvXiIoPzoiIig/OiIiPyg/ISIpfFteIlxcXXxcXC4pKiJ7MCwzfXwoPzpbXlxuXHIiXFxdfFxcLikqIj8pLyxudWxsLCciJ10sWyJsaXQiLC9eYCg/OlteXG5cclxcYF18XFwuKSpgPy8sbnVsbCwiYCJdLFsicHVuIiwvXlshIyUmKC0tOi1AWy1eey1+XSsvLG51bGwsIiEjJSYoKSorLC06Ozw9Pj9AW1xcXV57fH1+Il1dLFtbInN0ciIsL14nKD86W15cblxyJ1xcXXxcXCg/Oid8W15cblxyJ10rKSknL10sWyJsaXQiLC9eJ1skQS1aX2Etel1bXHckXSooPyFbXHckJ10pL10sWyJrd2QiLC9eKD86YWJzdHJhY3R8Y2FzZXxjYXRjaHxjbGFzc3xkZWZ8ZG98ZWxzZXxleHRlbmRzfGZpbmFsfGZpbmFsbHl8Zm9yfGZvclNvbWV8aWZ8aW1wbGljaXR8aW1wb3J0fGxhenl8bWF0Y2h8bmV3fG9iamVjdHxvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHJlcXVpcmVzfHJldHVybnxzZWFsZWR8c3VwZXJ8dGhyb3d8dHJhaXR8dHJ5fHR5cGV8dmFsfHZhcnx3aGlsZXx3aXRofHlpZWxkKVxiL10sCitbImxpdCIsL14oPzp0cnVlfGZhbHNlfG51bGx8dGhpcylcYi9dLFsibGl0IiwvXig/OjAoPzpbMC03XSt8eFtcZGEtZl0rKWw/fCg/OjB8WzEtOV1cZCopKD86KD86XC5cZCspPyg/OmVbKy1dP1xkKyk/Zj98bD8pfFxcLlxkKyg/OmVbKy1dP1xkKyk/Zj8pL2ldLFsidHlwIiwvXlskX10qW0EtWl1bXGQkQS1aX10qW2Etel1bXHckXSovXSxbInBsbiIsL15bJEEtWl9hLXpdW1x3JF0qL10sWyJjb20iLC9eXC8oPzpcLy4qfFwqKD86XC98XCoqW14qL10pKig/OlwqK1wvPyk/KS9dLFsicHVuIiwvXig/OlwuK3xcLykvXV0pLFsic2NhbGEiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1zcWwuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy1zcWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3MDViMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXNxbC5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXSxbInN0ciIsL14oPzoiKD86W14iXFxdfFxcLikqInwnKD86W14nXFxdfFxcLikqJykvLG51bGwsIlwiJyJdXSxbWyJjb20iLC9eKD86LS1bXlxuXHJdKnxcL1wqW1xTXHNdKj8oPzpcKlwvfCQpKS9dLFsia3dkIiwvXig/OmFkZHxhbGx8YWx0ZXJ8YW5kfGFueXxhc3xhc2N8YXV0aG9yaXphdGlvbnxiYWNrdXB8YmVnaW58YmV0d2VlbnxicmVha3xicm93c2V8YnVsa3xieXxjYXNjYWRlfGNhc2V8Y2hlY2t8Y2hlY2twb2ludHxjbG9zZXxjbHVzdGVyZWR8Y29hbGVzY2V8Y29sbGF0ZXxjb2x1bW58Y29tbWl0fGNvbXB1dGV8Y29uc3RyYWludHxjb250YWluc3xjb250YWluc3RhYmxlfGNvbnRpbnVlfGNvbnZlcnR8Y3JlYXRlfGNyb3NzfGN1cnJlbnR8Y3VycmVudF9kYXRlfGN1cnJlbnRfdGltZXxjdXJyZW50X3RpbWVzdGFtcHxjdXJyZW50X3VzZXJ8Y3Vyc29yfGRhdGFiYXNlfGRiY2N8ZGVhbGxvY2F0ZXxkZWNsYXJlfGRlZmF1bHR8ZGVsZXRlfGRlbnl8ZGVzY3xkaXNrfGRpc3RpbmN0fGRpc3RyaWJ1dGVkfGRvdWJsZXxkcm9wfGR1bW15fGR1bXB8ZWxzZXxlbmR8ZXJybHZsfGVzY2FwZXxleGNlcHR8ZXhlY3xleGVjdXRlfGV4aXN0c3xleGl0fGZldGNofGZpbGV8ZmlsbGZhY3Rvcnxmb3J8Zm9yZWlnbnxmcmVldGV4dHxmcmVldGV4dHRhYmxlfGZyb218ZnVsbHxmdW5jdGlvbnxnb3RvfGdyYW50fGdyb3VwfGhhdmluZ3xob2xkbG9ja3xpZGVudGl0eXxpZGVudGl0eWNvbHxpZGVudGl0eV9pbnNlcnR8aWZ8aW58aW5kZXh8aW5uZXJ8aW5zZXJ0fGludGVyc2VjdHxpbnRvfGlzfGpvaW58a2V5fGtpbGx8bGVmdHxsaWtlfGxpbmVub3xsb2FkfG1hdGNofG1lcmdlfG5hdGlvbmFsfG5vY2hlY2t8bm9uY2x1c3RlcmVkfG5vdHxudWxsfG51bGxpZnxvZnxvZmZ8b2Zmc2V0c3xvbnxvcGVufG9wZW5kYXRhc291cmNlfG9wZW5xdWVyeXxvcGVucm93c2V0fG9wZW54bWx8b3B0aW9ufG9yfG9yZGVyfG91dGVyfG92ZXJ8cGVyY2VudHxwbGFufHByZWNpc2lvbnxwcmltYXJ5fHByaW50fHByb2N8cHJvY2VkdXJlfHB1YmxpY3xyYWlzZXJyb3J8cmVhZHxyZWFkdGV4dHxyZWNvbmZpZ3VyZXxyZWZlcmVuY2VzfHJlcGxpY2F0aW9ufHJlc3RvcmV8cmVzdHJpY3R8cmV0dXJufHJldm9rZXxyaWdodHxyb2xsYmFja3xyb3djb3VudHxyb3dndWlkY29sfHJ1bGV8c2F2ZXxzY2hlbWF8c2VsZWN0fHNlc3Npb25fdXNlcnxzZXR8c2V0dXNlcnxzaHV0ZG93bnxzb21lfHN0YXRpc3RpY3N8c3lzdGVtX3VzZXJ8dGFibGV8dGV4dHNpemV8dGhlbnx0b3x0b3B8dHJhbnx0cmFuc2FjdGlvbnx0cmlnZ2VyfHRydW5jYXRlfHRzZXF1YWx8dW5pb258dW5pcXVlfHVwZGF0ZXx1cGRhdGV0ZXh0fHVzZXx1c2VyfHVzaW5nfHZhbHVlc3x2YXJ5aW5nfHZpZXd8d2FpdGZvcnx3aGVufHdoZXJlfHdoaWxlfHdpdGh8d3JpdGV0ZXh0KSg/PVteXHctXXwkKS9pLAorbnVsbF0sWyJsaXQiLC9eWystXT8oPzoweFtcZGEtZl0rfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrLV0/XGQrKT8pL2ldLFsicGxuIiwvXltfYS16XVtcdy1dKi9pXSxbInB1biIsL15bXlx3XHRcblxyICInXHhhMF1bXlx3XHRcblxyICInK1x4YTAtXSovXV0pLFsic3FsIl0pOwpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdGV4LmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdGV4LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTZmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy10ZXguanMKQEAgLTAsMCArMSBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciDCXHhhMCJdLFsiY29tIiwvXiVbXlxuXHJdKi8sbnVsbCwiJSJdXSxbWyJrd2QiLC9eXFxbQC1aYS16XSsvXSxbImt3ZCIsL15cXC4vXSxbInR5cCIsL15bJCZdL10sWyJsaXQiLC9bKy1dPyg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKGNtfGVtfGV4fGlufHBjfHB0fGJwfG1tKS9pXSxbInB1biIsL15bKCk9W1xde31dKy9dXSksWyJsYXRleCIsInRleCJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXZiLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdmIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1MDZiMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXZiLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXHUyMDI4XHUyMDI5XSsvLG51bGwsIlx0XG5cciDCXHhhMOKAqOKAqSJdLFsic3RyIiwvXig/OlsiXHUyMDFjXHUyMDFkXSg/OlteIlx1MjAxY1x1MjAxZF18WyJcdTIwMWNcdTIwMWRdezJ9KSg/OlsiXHUyMDFjXHUyMDFkXWN8JCl8WyJcdTIwMWNcdTIwMWRdKD86W14iXHUyMDFjXHUyMDFkXXxbIlx1MjAxY1x1MjAxZF17Mn0pKig/OlsiXHUyMDFjXHUyMDFkXXwkKSkvaSxudWxsLCci4oCc4oCdJ10sWyJjb20iLC9eWydcdTIwMThcdTIwMTldLiovLG51bGwsIifigJjigJkiXV0sW1sia3dkIiwvXig/OmFkZGhhbmRsZXJ8YWRkcmVzc29mfGFsaWFzfGFuZHxhbmRhbHNvfGFuc2l8YXN8YXNzZW1ibHl8YXV0b3xib29sZWFufGJ5cmVmfGJ5dGV8Ynl2YWx8Y2FsbHxjYXNlfGNhdGNofGNib29sfGNieXRlfGNjaGFyfGNkYXRlfGNkYmx8Y2RlY3xjaGFyfGNpbnR8Y2xhc3N8Y2xuZ3xjb2JqfGNvbnN0fGNzaG9ydHxjc25nfGNzdHJ8Y3R5cGV8ZGF0ZXxkZWNpbWFsfGRlY2xhcmV8ZGVmYXVsdHxkZWxlZ2F0ZXxkaW18ZGlyZWN0Y2FzdHxkb3xkb3VibGV8ZWFjaHxlbHNlfGVsc2VpZnxlbmR8ZW5kaWZ8ZW51bXxlcmFzZXxlcnJvcnxldmVudHxleGl0fGZpbmFsbHl8Zm9yfGZyaWVuZHxmdW5jdGlvbnxnZXR8Z2V0dHlwZXxnb3N1Ynxnb3RvfGhhbmRsZXN8aWZ8aW1wbGVtZW50c3xpbXBvcnRzfGlufGluaGVyaXRzfGludGVnZXJ8aW50ZXJmYWNlfGlzfGxldHxsaWJ8bGlrZXxsb25nfGxvb3B8bWV8bW9kfG1vZHVsZXxtdXN0aW5oZXJpdHxtdXN0b3ZlcnJpZGV8bXliYXNlfG15Y2xhc3N8bmFtZXNwYWNlfG5ld3xuZXh0fG5vdHxub3Rpbmhlcml0YWJsZXxub3RvdmVycmlkYWJsZXxvYmplY3R8b258b3B0aW9ufG9wdGlvbmFsfG9yfG9yZWxzZXxvdmVybG9hZHN8b3ZlcnJpZGFibGV8b3ZlcnJpZGVzfHBhcmFtYXJyYXl8cHJlc2VydmV8cHJpdmF0ZXxwcm9wZXJ0eXxwcm90ZWN0ZWR8cHVibGljfHJhaXNlZXZlbnR8cmVhZG9ubHl8cmVkaW18cmVtb3ZlaGFuZGxlcnxyZXN1bWV8cmV0dXJufHNlbGVjdHxzZXR8c2hhZG93c3xzaGFyZWR8c2hvcnR8c2luZ2xlfHN0YXRpY3xzdGVwfHN0b3B8c3RyaW5nfHN0cnVjdHVyZXxzdWJ8c3luY2xvY2t8dGhlbnx0aHJvd3x0b3x0cnl8dHlwZW9mfHVuaWNvZGV8dW50aWx8dmFyaWFudHx3ZW5kfHdoZW58d2hpbGV8d2l0aHx3aXRoZXZlbnRzfHdyaXRlb25seXx4b3J8ZW5kaWZ8Z29zdWJ8bGV0fHZhcmlhbnR8d2VuZClcYi9pLAorbnVsbF0sWyJjb20iLC9ecmVtLiovaV0sWyJsaXQiLC9eKD86dHJ1ZVxifGZhbHNlXGJ8bm90aGluZ1xifFxkKyg/OmVbKy1dP1xkK1tkZnJdP3xbZGZpbHJzXSk/fCg/OiZoW1xkYS1mXSt8Jm9bMC03XSspW2lsc10/fFxkKlwuXGQrKD86ZVsrLV0/XGQrKT9bZGZyXT98I1xzKyg/OlxkK1svLV1cZCtbLy1dXGQrKD86XHMrXGQrOlxkKyg/OjpcZCspPyhccyooPzphbXxwbSkpPyk/fFxkKzpcZCsoPzo6XGQrKT8oXHMqKD86YW18cG0pKT8pXHMrIykvaV0sWyJwbG4iLC9eKD86KD86W2Etel18X1x3KVx3KnxcWyg/OlthLXpdfF9cdylcdypdKS9pXSxbInB1biIsL15bXlx3XHRcblxyICInW1xdXHhhMFx1MjAxOFx1MjAxOVx1MjAxY1x1MjAxZFx1MjAyOFx1MjAyOV0rL10sWyJwdW4iLC9eKD86XFt8XSkvXV0pLFsidmIiLCJ2YnMiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy12aGRsLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdmhkbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjhiNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmctdmhkbC5qcwpAQCAtMCwwICsxLDMgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgwlx4YTAiXV0sW1sic3RyIiwvXig/Oltib3hdPyIoPzpbXiJdfCIiKSoifCcuJykvaV0sWyJjb20iLC9eLS1bXlxuXHJdKi9dLFsia3dkIiwvXig/OmFic3xhY2Nlc3N8YWZ0ZXJ8YWxpYXN8YWxsfGFuZHxhcmNoaXRlY3R1cmV8YXJyYXl8YXNzZXJ0fGF0dHJpYnV0ZXxiZWdpbnxibG9ja3xib2R5fGJ1ZmZlcnxidXN8Y2FzZXxjb21wb25lbnR8Y29uZmlndXJhdGlvbnxjb25zdGFudHxkaXNjb25uZWN0fGRvd250b3xlbHNlfGVsc2lmfGVuZHxlbnRpdHl8ZXhpdHxmaWxlfGZvcnxmdW5jdGlvbnxnZW5lcmF0ZXxnZW5lcmljfGdyb3VwfGd1YXJkZWR8aWZ8aW1wdXJlfGlufGluZXJ0aWFsfGlub3V0fGlzfGxhYmVsfGxpYnJhcnl8bGlua2FnZXxsaXRlcmFsfGxvb3B8bWFwfG1vZHxuYW5kfG5ld3xuZXh0fG5vcnxub3R8bnVsbHxvZnxvbnxvcGVufG9yfG90aGVyc3xvdXR8cGFja2FnZXxwb3J0fHBvc3Rwb25lZHxwcm9jZWR1cmV8cHJvY2Vzc3xwdXJlfHJhbmdlfHJlY29yZHxyZWdpc3RlcnxyZWplY3R8cmVtfHJlcG9ydHxyZXR1cm58cm9sfHJvcnxzZWxlY3R8c2V2ZXJpdHl8c2hhcmVkfHNpZ25hbHxzbGF8c2xsfHNyYXxzcmx8c3VidHlwZXx0aGVufHRvfHRyYW5zcG9ydHx0eXBlfHVuYWZmZWN0ZWR8dW5pdHN8dW50aWx8dXNlfHZhcmlhYmxlfHdhaXR8d2hlbnx3aGlsZXx3aXRofHhub3J8eG9yKSg/PVteXHctXXwkKS9pLAorbnVsbF0sWyJ0eXAiLC9eKD86Yml0fGJpdF92ZWN0b3J8Y2hhcmFjdGVyfGJvb2xlYW58aW50ZWdlcnxyZWFsfHRpbWV8c3RyaW5nfHNldmVyaXR5X2xldmVsfHBvc2l0aXZlfG5hdHVyYWx8c2lnbmVkfHVuc2lnbmVkfGxpbmV8dGV4dHxzdGRfdT9sb2dpYyg/Ol92ZWN0b3IpPykoPz1bXlx3LV18JCkvaSxudWxsXSxbInR5cCIsL14nKD86YWN0aXZlfGFzY2VuZGluZ3xiYXNlfGRlbGF5ZWR8ZHJpdmluZ3xkcml2aW5nX3ZhbHVlfGV2ZW50fGhpZ2h8aW1hZ2V8aW5zdGFuY2VfbmFtZXxsYXN0X2FjdGl2ZXxsYXN0X2V2ZW50fGxhc3RfdmFsdWV8bGVmdHxsZWZ0b2Z8bGVuZ3RofGxvd3xwYXRoX25hbWV8cG9zfHByZWR8cXVpZXR8cmFuZ2V8cmV2ZXJzZV9yYW5nZXxyaWdodHxyaWdodG9mfHNpbXBsZV9uYW1lfHN0YWJsZXxzdWNjfHRyYW5zYWN0aW9ufHZhbHx2YWx1ZSkoPz1bXlx3LV18JCkvaSxudWxsXSxbImxpdCIsL15cZCsoPzpfXGQrKSooPzojW1x3LlxcXSsjKD86WystXT9cZCsoPzpfXGQrKSopP3woPzpcLlxkKyg/Ol9cZCspKik/KD86ZVsrLV0/XGQrKD86X1xkKykqKT8pL2ldLAorWyJwbG4iLC9eKD86W2Etel1cdyp8XFxbXlxcXSpcXCkvaV0sWyJwdW4iLC9eW15cd1x0XG5cciAiJ1x4YTBdW15cd1x0XG5cciAiJ1x4YTAtXSovXV0pLFsidmhkbCIsInZoZCJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXdpa2kuanMgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy13aWtpLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGI0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy13aWtpLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1xkXHQgYS1naS16XHhhMF0rLyxudWxsLCJcdCDCXHhhMGFiY2RlZmdpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Il0sWyJwdW4iLC9eWyo9W1xdXn5dKy8sbnVsbCwiPSp+XltdIl1dLFtbImxhbmctd2lraS5tZXRhIiwvKD86Xl58XHJcbj98XG4pKCNbYS16XSspXGIvXSxbImxpdCIsL15bQS1aXVthLXpdW1xkYS16XStbQS1aXVthLXpdW15cV19dK1xiL10sWyJsYW5nLSIsL157e3soW1xTXHNdKz8pfX19L10sWyJsYW5nLSIsL15gKFteXG5ccmBdKylgL10sWyJzdHIiLC9eaHR0cHM/OlwvXC9bXlxzIy8/XSooPzpcL1teXHMjP10qKT8oPzpcP1teXHMjXSopPyg/OiNcUyopPy9pXSxbInBsbiIsL14oPzpcclxufFtcU1xzXSlbXlxuXHIjKj1BLVteYGh7fl0qL11dKSxbIndpa2kiXSk7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbImt3ZCIsL14jW2Etel0rL2ksbnVsbCwiIyJdXSxbXSksWyJ3aWtpLm1ldGEiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy14cS5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9sYW5nLXhxLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjNhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy14cS5qcwpAQCAtMCwwICsxLDMgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sidmFyIHBsbiIsL15cJFtcdy1dKy8sbnVsbCwiJCJdXSxbWyJwbG4iLC9eW1xzPV1bPD5dW1xzPV0vXSxbImxpdCIsL15AW1x3LV0rL10sWyJ0YWciLC9ePFwvP1thLXpdKD86W1x3LS46XSpcdyk/fFwvPz4kL2ldLFsiY29tIiwvXlwoOltcU1xzXSo/OlwpL10sWyJwbG4iLC9eWygpLC87W1xde31dJC9dLFsic3RyIiwvXig/OiIoPzpbXiJcXHtdfFxcW1xTXHNdKSooPzoifCQpfCcoPzpbXidcXHtdfFxcW1xTXHNdKSooPzonfCQpKS8sbnVsbCwiXCInIl0sWyJrd2QiLC9eKD86eHF1ZXJ5fHdoZXJlfHZlcnNpb258dmFyaWFibGV8dW5pb258dHlwZXN3aXRjaHx0cmVhdHx0b3x0aGVufHRleHR8c3RhYmxlfHNvcnRieXxzb21lfHNlbGZ8c2NoZW1hfHNhdGlzZmllc3xyZXR1cm5zfHJldHVybnxyZWZ8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbnxwcmVjZWRpbmctc2libGluZ3xwcmVjZWRpbmd8cHJlY2VkZXN8cGFyZW50fG9ubHl8b2Z8bm9kZXxuYW1lc3BhY2V8bW9kdWxlfGxldHxpdGVtfGludGVyc2VjdHxpbnN0YW5jZXxpbnxpbXBvcnR8aWZ8ZnVuY3Rpb258Zm9yfGZvbGxvd3N8Zm9sbG93aW5nLXNpYmxpbmd8Zm9sbG93aW5nfGV4dGVybmFsfGV4Y2VwdHxldmVyeXxlbHNlfGVsZW1lbnR8ZGVzY2VuZGluZ3xkZXNjZW5kYW50LW9yLXNlbGZ8ZGVzY2VuZGFudHxkZWZpbmV8ZGVmYXVsdHxkZWNsYXJlfGNvbW1lbnR8Y2hpbGR8Y2FzdHxjYXNlfGJlZm9yZXxhdHRyaWJ1dGV8YXNzZXJ0fGFzY2VuZGluZ3xhc3xhbmNlc3Rvci1vci1zZWxmfGFuY2VzdG9yfGFmdGVyfGVxfG9yZGVyfGJ5fG9yfGFuZHxzY2hlbWEtZWxlbWVudHxkb2N1bWVudC1ub2RlfG5vZGV8YXQpXGIvXSwKK1sidHlwIiwvXig/OnhzOnllYXJNb250aER1cmF0aW9ufHhzOnVuc2lnbmVkTG9uZ3x4czp0aW1lfHhzOnN0cmluZ3x4czpzaG9ydHx4czpRTmFtZXx4czpOYW1lfHhzOmxvbmd8eHM6aW50ZWdlcnx4czppbnR8eHM6Z1llYXJNb250aHx4czpnWWVhcnx4czpnTW9udGhEYXl8eHM6Z0RheXx4czpmbG9hdHx4czpkdXJhdGlvbnx4czpkb3VibGV8eHM6ZGVjaW1hbHx4czpkYXlUaW1lRHVyYXRpb258eHM6ZGF0ZVRpbWV8eHM6ZGF0ZXx4czpieXRlfHhzOmJvb2xlYW58eHM6YW55VVJJfHhmOnllYXJNb250aER1cmF0aW9uKVxiLyxudWxsXSxbImZ1biBwbG4iLC9eKD86eHA6ZGVyZWZlcmVuY2V8eGluYzpub2RlLWV4cGFuZHx4aW5jOmxpbmstcmVmZXJlbmNlc3x4aW5jOmxpbmstZXhwYW5kfHhodG1sOnJlc3RydWN0dXJlfHhodG1sOmNsZWFufHhodG1sOmFkZC1saXN0c3x4ZG1wOnppcC1tYW5pZmVzdHx4ZG1wOnppcC1nZXR8eGRtcDp6aXAtY3JlYXRlfHhkbXA6eHF1ZXJ5LXZlcnNpb258eGRtcDp3b3JkLWNvbnZlcnR8eGRtcDp3aXRoLW5hbWVzcGFjZXN8eGRtcDp2ZXJzaW9ufHhkbXA6dmFsdWV8eGRtcDp1c2VyLXJvbGVzfHhkbXA6dXNlci1sYXN0LWxvZ2lufHhkbXA6dXNlcnx4ZG1wOnVybC1lbmNvZGV8eGRtcDp1cmwtZGVjb2RlfHhkbXA6dXJpLWlzLWZpbGV8eGRtcDp1cmktZm9ybWF0fHhkbXA6dXJpLWNvbnRlbnQtdHlwZXx4ZG1wOnVucXVvdGV8eGRtcDp1bnBhdGh8eGRtcDp0cmlnZ2Vycy1kYXRhYmFzZXx4ZG1wOnRyYWNlfHhkbXA6dG8tanNvbnx4ZG1wOnRpZHl8eGRtcDpzdWJiaW5hcnl8eGRtcDpzdHJmdGltZXx4ZG1wOnNwYXduLWlufHhkbXA6c3Bhd258eGRtcDpzbGVlcHx4ZG1wOnNodXRkb3dufHhkbXA6c2V0LXNlc3Npb24tZmllbGR8eGRtcDpzZXQtcmVzcG9uc2UtZW5jb2Rpbmd8eGRtcDpzZXQtcmVzcG9uc2UtY29udGVudC10eXBlfHhkbXA6c2V0LXJlc3BvbnNlLWNvZGV8eGRtcDpzZXQtcmVxdWVzdC10aW1lLWxpbWl0fHhkbXA6c2V0fHhkbXA6c2VydmVyc3x4ZG1wOnNlcnZlci1zdGF0dXN8eGRtcDpzZXJ2ZXItbmFtZXx4ZG1wOnNlcnZlcnx4ZG1wOnNlY3VyaXR5LWRhdGFiYXNlfHhkbXA6c2VjdXJpdHktYXNzZXJ0fHhkbXA6c2NoZW1hLWRhdGFiYXNlfHhkbXA6c2F2ZXx4ZG1wOnJvbGUtcm9sZXN8eGRtcDpyb2xlfHhkbXA6cmV0aHJvd3x4ZG1wOnJlc3RhcnR8eGRtcDpyZXF1ZXN0LXRpbWVzdGFtcHx4ZG1wOnJlcXVlc3Qtc3RhdHVzfHhkbXA6cmVxdWVzdC1jYW5jZWx8eGRtcDpyZXF1ZXN0fHhkbXA6cmVkaXJlY3QtcmVzcG9uc2V8eGRtcDpyYW5kb218eGRtcDpxdW90ZXx4ZG1wOnF1ZXJ5LXRyYWNlfHhkbXA6cXVlcnktbWV0ZXJzfHhkbXA6cHJvZHVjdC1lZGl0aW9ufHhkbXA6cHJpdmlsZWdlLXJvbGVzfHhkbXA6cHJpdmlsZWdlfHhkbXA6cHJldHR5LXByaW50fHhkbXA6cG93ZXJwb2ludC1jb252ZXJ0fHhkbXA6cGxhdGZvcm18eGRtcDpwZXJtaXNzaW9ufHhkbXA6cGRmLWNvbnZlcnR8eGRtcDpwYXRofHhkbXA6b2N0YWwtdG8taW50ZWdlcnx4ZG1wOm5vZGUtdXJpfHhkbXA6bm9kZS1yZXBsYWNlfHhkbXA6bm9kZS1raW5kfHhkbXA6bm9kZS1pbnNlcnQtY2hpbGR8eGRtcDpub2RlLWluc2VydC1iZWZvcmV8eGRtcDpub2RlLWluc2VydC1hZnRlcnx4ZG1wOm5vZGUtZGVsZXRlfHhkbXA6bm9kZS1kYXRhYmFzZXx4ZG1wOm11bDY0fHhkbXA6bW9kdWxlcy1yb290fHhkbXA6bW9kdWxlcy1kYXRhYmFzZXx4ZG1wOm1lcmdpbmd8eGRtcDptZXJnZS1jYW5jZWx8eGRtcDptZXJnZXx4ZG1wOm1kNXx4ZG1wOmxvZ291dHx4ZG1wOmxvZ2lufHhkbXA6bG9nLWxldmVsfHhkbXA6bG9nfHhkbXA6bG9jay1yZWxlYXNlfHhkbXA6bG9jay1hY3F1aXJlfHhkbXA6bG9hZHx4ZG1wOmludm9rZS1pbnx4ZG1wOmludm9rZXx4ZG1wOmludGVnZXItdG8tb2N0YWx8eGRtcDppbnRlZ2VyLXRvLWhleHx4ZG1wOmh0dHAtcHV0fHhkbXA6aHR0cC1wb3N0fHhkbXA6aHR0cC1vcHRpb25zfHhkbXA6aHR0cC1oZWFkfHhkbXA6aHR0cC1nZXR8eGRtcDpodHRwLWRlbGV0ZXx4ZG1wOmhvc3RzfHhkbXA6aG9zdC1zdGF0dXN8eGRtcDpob3N0LW5hbWV8eGRtcDpob3N0fHhkbXA6aGV4LXRvLWludGVnZXJ8eGRtcDpoYXNoNjR8eGRtcDpoYXNoMzJ8eGRtcDpoYXMtcHJpdmlsZWdlfHhkbXA6Z3JvdXBzfHhkbXA6Z3JvdXAtc2VydmVzfHhkbXA6Z3JvdXAtc2VydmVyc3x4ZG1wOmdyb3VwLW5hbWV8eGRtcDpncm91cC1ob3N0c3x4ZG1wOmdyb3VwfHhkbXA6Z2V0LXNlc3Npb24tZmllbGQtbmFtZXN8eGRtcDpnZXQtc2Vzc2lvbi1maWVsZHx4ZG1wOmdldC1yZXNwb25zZS1lbmNvZGluZ3x4ZG1wOmdldC1yZXNwb25zZS1jb2RlfHhkbXA6Z2V0LXJlcXVlc3QtdXNlcm5hbWV8eGRtcDpnZXQtcmVxdWVzdC11c2VyfHhkbXA6Z2V0LXJlcXVlc3QtdXJsfHhkbXA6Z2V0LXJlcXVlc3QtcHJvdG9jb2x8eGRtcDpnZXQtcmVxdWVzdC1wYXRofHhkbXA6Z2V0LXJlcXVlc3QtbWV0aG9kfHhkbXA6Z2V0LXJlcXVlc3QtaGVhZGVyLW5hbWVzfHhkbXA6Z2V0LXJlcXVlc3QtaGVhZGVyfHhkbXA6Z2V0LXJlcXVlc3QtZmllbGQtbmFtZXN8eGRtcDpnZXQtcmVxdWVzdC1maWVsZC1maWxlbmFtZXx4ZG1wOmdldC1yZXF1ZXN0LWZpZWxkLWNvbnRlbnQtdHlwZXx4ZG1wOmdldC1yZXF1ZXN0LWZpZWxkfHhkbXA6Z2V0LXJlcXVlc3QtY2xpZW50LWNlcnRpZmljYXRlfHhkbXA6Z2V0LXJlcXVlc3QtY2xpZW50LWFkZHJlc3N8eGRtcDpnZXQtcmVxdWVzdC1ib2R5fHhkbXA6Z2V0LWN1cnJlbnQtdXNlcnx4ZG1wOmdldC1jdXJyZW50LXJvbGVzfHhkbXA6Z2V0fHhkbXA6ZnVuY3Rpb24tbmFtZXx4ZG1wOmZ1bmN0aW9uLW1vZHVsZXx4ZG1wOmZ1bmN0aW9ufHhkbXA6ZnJvbS1qc29ufHhkbXA6Zm9yZXN0c3x4ZG1wOmZvcmVzdC1zdGF0dXN8eGRtcDpmb3Jlc3QtcmVzdG9yZXx4ZG1wOmZvcmVzdC1yZXN0YXJ0fHhkbXA6Zm9yZXN0LW5hbWV8eGRtcDpmb3Jlc3QtZGVsZXRlfHhkbXA6Zm9yZXN0LWRhdGFiYXNlc3x4ZG1wOmZvcmVzdC1jb3VudHN8eGRtcDpmb3Jlc3QtY2xlYXJ8eGRtcDpmb3Jlc3QtYmFja3VwfHhkbXA6Zm9yZXN0fHhkbXA6ZmlsZXN5c3RlbS1maWxlfHhkbXA6ZmlsZXN5c3RlbS1kaXJlY3Rvcnl8eGRtcDpleGlzdHN8eGRtcDpleGNlbC1jb252ZXJ0fHhkbXA6ZXZhbC1pbnx4ZG1wOmV2YWx8eGRtcDplc3RpbWF0ZXx4ZG1wOmVtYWlsfHhkbXA6ZWxlbWVudC1jb250ZW50LXR5cGV8eGRtcDplbGFwc2VkLXRpbWV8eGRtcDpkb2N1bWVudC1zZXQtcXVhbGl0eXx4ZG1wOmRvY3VtZW50LXNldC1wcm9wZXJ0eXx4ZG1wOmRvY3VtZW50LXNldC1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtc2V0LXBlcm1pc3Npb25zfHhkbXA6ZG9jdW1lbnQtc2V0LWNvbGxlY3Rpb25zfHhkbXA6ZG9jdW1lbnQtcmVtb3ZlLXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1yZW1vdmUtcGVybWlzc2lvbnN8eGRtcDpkb2N1bWVudC1yZW1vdmUtY29sbGVjdGlvbnN8eGRtcDpkb2N1bWVudC1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtbG9ja3N8eGRtcDpkb2N1bWVudC1sb2FkfHhkbXA6ZG9jdW1lbnQtaW5zZXJ0fHhkbXA6ZG9jdW1lbnQtZ2V0LXF1YWxpdHl8eGRtcDpkb2N1bWVudC1nZXQtcHJvcGVydGllc3x4ZG1wOmRvY3VtZW50LWdldC1wZXJtaXNzaW9uc3x4ZG1wOmRvY3VtZW50LWdldC1jb2xsZWN0aW9uc3x4ZG1wOmRvY3VtZW50LWdldHx4ZG1wOmRvY3VtZW50LWZvcmVzdHx4ZG1wOmRvY3VtZW50LWRlbGV0ZXx4ZG1wOmRvY3VtZW50LWFkZC1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtYWRkLXBlcm1pc3Npb25zfHhkbXA6ZG9jdW1lbnQtYWRkLWNvbGxlY3Rpb25zfHhkbXA6ZGlyZWN0b3J5LXByb3BlcnRpZXN8eGRtcDpkaXJlY3RvcnktbG9ja3N8eGRtcDpkaXJlY3RvcnktZGVsZXRlfHhkbXA6ZGlyZWN0b3J5LWNyZWF0ZXx4ZG1wOmRpcmVjdG9yeXx4ZG1wOmRpYWNyaXRpYy1sZXNzfHhkbXA6ZGVzY3JpYmV8eGRtcDpkZWZhdWx0LXBlcm1pc3Npb25zfHhkbXA6ZGVmYXVsdC1jb2xsZWN0aW9uc3x4ZG1wOmRhdGFiYXNlc3x4ZG1wOmRhdGFiYXNlLXJlc3RvcmUtdmFsaWRhdGV8eGRtcDpkYXRhYmFzZS1yZXN0b3JlLXN0YXR1c3x4ZG1wOmRhdGFiYXNlLXJlc3RvcmUtY2FuY2VsfHhkbXA6ZGF0YWJhc2UtcmVzdG9yZXx4ZG1wOmRhdGFiYXNlLW5hbWV8eGRtcDpkYXRhYmFzZS1mb3Jlc3RzfHhkbXA6ZGF0YWJhc2UtYmFja3VwLXZhbGlkYXRlfHhkbXA6ZGF0YWJhc2UtYmFja3VwLXN0YXR1c3x4ZG1wOmRhdGFiYXNlLWJhY2t1cC1wdXJnZXx4ZG1wOmRhdGFiYXNlLWJhY2t1cC1jYW5jZWx8eGRtcDpkYXRhYmFzZS1iYWNrdXB8eGRtcDpkYXRhYmFzZXx4ZG1wOmNvbGxlY3Rpb24tcHJvcGVydGllc3x4ZG1wOmNvbGxlY3Rpb24tbG9ja3N8eGRtcDpjb2xsZWN0aW9uLWRlbGV0ZXx4ZG1wOmNvbGxhdGlvbi1jYW5vbmljYWwtdXJpfHhkbXA6Y2FzdGFibGUtYXN8eGRtcDpjYW4tZ3JhbnQtcm9sZXN8eGRtcDpiYXNlNjQtZW5jb2RlfHhkbXA6YmFzZTY0LWRlY29kZXx4ZG1wOmFyY2hpdGVjdHVyZXx4ZG1wOmFwcGx5fHhkbXA6YW1wLXJvbGVzfHhkbXA6YW1wfHhkbXA6YWRkNjR8eGRtcDphZGQtcmVzcG9uc2UtaGVhZGVyfHhkbXA6YWNjZXNzfHRyZ3I6dHJpZ2dlci1zZXQtcmVjdXJzaXZlfHRyZ3I6dHJpZ2dlci1zZXQtcGVybWlzc2lvbnN8dHJncjp0cmlnZ2VyLXNldC1uYW1lfHRyZ3I6dHJpZ2dlci1zZXQtbW9kdWxlfHRyZ3I6dHJpZ2dlci1zZXQtZXZlbnR8dHJncjp0cmlnZ2VyLXNldC1kZXNjcmlwdGlvbnx0cmdyOnRyaWdnZXItcmVtb3ZlLXBlcm1pc3Npb25zfHRyZ3I6dHJpZ2dlci1tb2R1bGV8dHJncjp0cmlnZ2VyLWdldC1wZXJtaXNzaW9uc3x0cmdyOnRyaWdnZXItZW5hYmxlfHRyZ3I6dHJpZ2dlci1kaXNhYmxlfHRyZ3I6dHJpZ2dlci1kYXRhYmFzZS1vbmxpbmUtZXZlbnR8dHJncjp0cmlnZ2VyLWRhdGEtZXZlbnR8dHJncjp0cmlnZ2VyLWFkZC1wZXJtaXNzaW9uc3x0cmdyOnJlbW92ZS10cmlnZ2VyfHRyZ3I6cHJvcGVydHktY29udGVudHx0cmdyOnByZS1jb21taXR8dHJncjpwb3N0LWNvbW1pdHx0cmdyOmdldC10cmlnZ2VyLWJ5LWlkfHRyZ3I6Z2V0LXRyaWdnZXJ8dHJncjpkb2N1bWVudC1zY29wZXx0cmdyOmRvY3VtZW50LWNvbnRlbnR8dHJncjpkaXJlY3Rvcnktc2NvcGV8dHJncjpjcmVhdGUtdHJpZ2dlcnx0cmdyOmNvbGxlY3Rpb24tc2NvcGV8dHJncjphbnktcHJvcGVydHktY29udGVudHx0aHNyOnNldC1lbnRyeXx0aHNyOnJlbW92ZS10ZXJtfHRoc3I6cmVtb3ZlLXN5bm9ueW18dGhzcjpyZW1vdmUtZW50cnl8dGhzcjpxdWVyeS1sb29rdXB8dGhzcjpsb29rdXB8dGhzcjpsb2FkfHRoc3I6aW5zZXJ0fHRoc3I6ZXhwYW5kfHRoc3I6YWRkLXN5bm9ueW18c3BlbGw6c3VnZ2VzdC1kZXRhaWxlZHxzcGVsbDpzdWdnZXN0fHNwZWxsOnJlbW92ZS13b3JkfHNwZWxsOm1ha2UtZGljdGlvbmFyeXxzcGVsbDpsb2FkfHNwZWxsOmxldmVuc2h0ZWluLWRpc3RhbmNlfHNwZWxsOmlzLWNvcnJlY3R8c3BlbGw6aW5zZXJ0fHNwZWxsOmRvdWJsZS1tZXRhcGhvbmV8c3BlbGw6YWRkLXdvcmR8c2VjOnVzZXJzLWNvbGxlY3Rpb258c2VjOnVzZXItc2V0LXJvbGVzfHNlYzp1c2VyLXNldC1wYXNzd29yZHxzZWM6dXNlci1zZXQtbmFtZXxzZWM6dXNlci1zZXQtZGVzY3JpcHRpb258c2VjOnVzZXItc2V0LWRlZmF1bHQtcGVybWlzc2lvbnN8c2VjOnVzZXItc2V0LWRlZmF1bHQtY29sbGVjdGlvbnN8c2VjOnVzZXItcmVtb3ZlLXJvbGVzfHNlYzp1c2VyLXByaXZpbGVnZXN8c2VjOnVzZXItZ2V0LXJvbGVzfHNlYzp1c2VyLWdldC1kZXNjcmlwdGlvbnxzZWM6dXNlci1nZXQtZGVmYXVsdC1wZXJtaXNzaW9uc3xzZWM6dXNlci1nZXQtZGVmYXVsdC1jb2xsZWN0aW9uc3xzZWM6dXNlci1kb2MtcGVybWlzc2lvbnN8c2VjOnVzZXItZG9jLWNvbGxlY3Rpb25zfHNlYzp1c2VyLWFkZC1yb2xlc3xzZWM6dW5wcm90ZWN0LWNvbGxlY3Rpb258c2VjOnVpZC1mb3ItbmFtZXxzZWM6c2V0LXJlYWxtfHNlYzpzZWN1cml0eS12ZXJzaW9ufHNlYzpzZWN1cml0eS1uYW1lc3BhY2V8c2VjOnNlY3VyaXR5LWluc3RhbGxlZHxzZWM6c2VjdXJpdHktY29sbGVjdGlvbnxzZWM6cm9sZXMtY29sbGVjdGlvbnxzZWM6cm9sZS1zZXQtcm9sZXN8c2VjOnJvbGUtc2V0LW5hbWV8c2VjOnJvbGUtc2V0LWRlc2NyaXB0aW9ufHNlYzpyb2xlLXNldC1kZWZhdWx0LXBlcm1pc3Npb25zfHNlYzpyb2xlLXNldC1kZWZhdWx0LWNvbGxlY3Rpb25zfHNlYzpyb2xlLXJlbW92ZS1yb2xlc3xzZWM6cm9sZS1wcml2aWxlZ2VzfHNlYzpyb2xlLWdldC1yb2xlc3xzZWM6cm9sZS1nZXQtZGVzY3JpcHRpb258c2VjOnJvbGUtZ2V0LWRlZmF1bHQtcGVybWlzc2lvbnN8c2VjOnJvbGUtZ2V0LWRlZmF1bHQtY29sbGVjdGlvbnN8c2VjOnJvbGUtZG9jLXBlcm1pc3Npb25zfHNlYzpyb2xlLWRvYy1jb2xsZWN0aW9uc3xzZWM6cm9sZS1hZGQtcm9sZXN8c2VjOnJlbW92ZS11c2VyfHNlYzpyZW1vdmUtcm9sZS1mcm9tLXVzZXJzfHNlYzpyZW1vdmUtcm9sZS1mcm9tLXJvbGV8c2VjOnJlbW92ZS1yb2xlLWZyb20tcHJpdmlsZWdlc3xzZWM6cmVtb3ZlLXJvbGUtZnJvbS1hbXBzfHNlYzpyZW1vdmUtcm9sZXxzZWM6cmVtb3ZlLXByaXZpbGVnZXxzZWM6cmVtb3ZlLWFtcHxzZWM6cHJvdGVjdC1jb2xsZWN0aW9ufHNlYzpwcml2aWxlZ2VzLWNvbGxlY3Rpb258c2VjOnByaXZpbGVnZS1zZXQtcm9sZXN8c2VjOnByaXZpbGVnZS1zZXQtbmFtZXxzZWM6cHJpdmlsZWdlLXJlbW92ZS1yb2xlc3xzZWM6cHJpdmlsZWdlLWdldC1yb2xlc3xzZWM6cHJpdmlsZWdlLWFkZC1yb2xlc3xzZWM6cHJpdi1kb2MtcGVybWlzc2lvbnN8c2VjOnByaXYtZG9jLWNvbGxlY3Rpb25zfHNlYzpnZXQtdXNlci1uYW1lc3xzZWM6Z2V0LXVuaXF1ZS1lbGVtLWlkfHNlYzpnZXQtcm9sZS1uYW1lc3xzZWM6Z2V0LXJvbGUtaWRzfHNlYzpnZXQtcHJpdmlsZWdlfHNlYzpnZXQtZGlzdGluY3QtcGVybWlzc2lvbnN8c2VjOmdldC1jb2xsZWN0aW9ufHNlYzpnZXQtYW1wfHNlYzpjcmVhdGUtdXNlci13aXRoLXJvbGV8c2VjOmNyZWF0ZS11c2VyfHNlYzpjcmVhdGUtcm9sZXxzZWM6Y3JlYXRlLXByaXZpbGVnZXxzZWM6Y3JlYXRlLWFtcHxzZWM6Y29sbGVjdGlvbnMtY29sbGVjdGlvbnxzZWM6Y29sbGVjdGlvbi1zZXQtcGVybWlzc2lvbnN8c2VjOmNvbGxlY3Rpb24tcmVtb3ZlLXBlcm1pc3Npb25zfHNlYzpjb2xsZWN0aW9uLWdldC1wZXJtaXNzaW9uc3xzZWM6Y29sbGVjdGlvbi1hZGQtcGVybWlzc2lvbnN8c2VjOmNoZWNrLWFkbWlufHNlYzphbXBzLWNvbGxlY3Rpb258c2VjOmFtcC1zZXQtcm9sZXN8c2VjOmFtcC1yZW1vdmUtcm9sZXN8c2VjOmFtcC1nZXQtcm9sZXN8c2VjOmFtcC1kb2MtcGVybWlzc2lvbnN8c2VjOmFtcC1kb2MtY29sbGVjdGlvbnN8c2VjOmFtcC1hZGQtcm9sZXN8c2VhcmNoOnVucGFyc2V8c2VhcmNoOnN1Z2dlc3R8c2VhcmNoOnNuaXBwZXR8c2VhcmNoOnNlYXJjaHxzZWFyY2g6cmVzb2x2ZS1ub2Rlc3xzZWFyY2g6cmVzb2x2ZXxzZWFyY2g6cmVtb3ZlLWNvbnN0cmFpbnR8c2VhcmNoOnBhcnNlfHNlYXJjaDpnZXQtZGVmYXVsdC1vcHRpb25zfHNlYXJjaDplc3RpbWF0ZXxzZWFyY2g6Y2hlY2stb3B0aW9uc3xwcm9mOnZhbHVlfHByb2Y6cmVzZXR8cHJvZjpyZXBvcnR8cHJvZjppbnZva2V8cHJvZjpldmFsfHByb2Y6ZW5hYmxlfHByb2Y6ZGlzYWJsZXxwcm9mOmFsbG93ZWR8cHB0OmNsZWFufHBraTp0ZW1wbGF0ZS1zZXQtcmVxdWVzdHxwa2k6dGVtcGxhdGUtc2V0LW5hbWV8cGtpOnRlbXBsYXRlLXNldC1rZXktdHlwZXxwa2k6dGVtcGxhdGUtc2V0LWtleS1vcHRpb25zfHBraTp0ZW1wbGF0ZS1zZXQtZGVzY3JpcHRpb258cGtpOnRlbXBsYXRlLWluLXVzZXxwa2k6dGVtcGxhdGUtZ2V0LXZlcnNpb258cGtpOnRlbXBsYXRlLWdldC1yZXF1ZXN0fHBraTp0ZW1wbGF0ZS1nZXQtbmFtZXxwa2k6dGVtcGxhdGUtZ2V0LWtleS10eXBlfHBraTp0ZW1wbGF0ZS1nZXQta2V5LW9wdGlvbnN8cGtpOnRlbXBsYXRlLWdldC1pZHxwa2k6dGVtcGxhdGUtZ2V0LWRlc2NyaXB0aW9ufHBraTpuZWVkLWNlcnRpZmljYXRlfHBraTppcy10ZW1wb3Jhcnl8cGtpOmluc2VydC10cnVzdGVkLWNlcnRpZmljYXRlc3xwa2k6aW5zZXJ0LXRlbXBsYXRlfHBraTppbnNlcnQtc2lnbmVkLWNlcnRpZmljYXRlc3xwa2k6aW5zZXJ0LWNlcnRpZmljYXRlLXJldm9jYXRpb24tbGlzdHxwa2k6Z2V0LXRydXN0ZWQtY2VydGlmaWNhdGUtaWRzfHBraTpnZXQtdGVtcGxhdGUtaWRzfHBraTpnZXQtdGVtcGxhdGUtY2VydGlmaWNhdGUtYXV0aG9yaXR5fHBraTpnZXQtdGVtcGxhdGUtYnktbmFtZXxwa2k6Z2V0LXRlbXBsYXRlfHBraTpnZXQtcGVuZGluZy1jZXJ0aWZpY2F0ZS1yZXF1ZXN0cy14bWx8cGtpOmdldC1wZW5kaW5nLWNlcnRpZmljYXRlLXJlcXVlc3RzLXBlbXxwa2k6Z2V0LXBlbmRpbmctY2VydGlmaWNhdGUtcmVxdWVzdHxwa2k6Z2V0LWNlcnRpZmljYXRlcy1mb3ItdGVtcGxhdGUteG1sfHBraTpnZXQtY2VydGlmaWNhdGVzLWZvci10ZW1wbGF0ZXxwa2k6Z2V0LWNlcnRpZmljYXRlc3xwa2k6Z2V0LWNlcnRpZmljYXRlLXhtbHxwa2k6Z2V0LWNlcnRpZmljYXRlLXBlbXxwa2k6Z2V0LWNlcnRpZmljYXRlfHBraTpnZW5lcmF0ZS10ZW1wb3JhcnktY2VydGlmaWNhdGUtaWYtbmVjZXNzYXJ5fHBraTpnZW5lcmF0ZS10ZW1wb3JhcnktY2VydGlmaWNhdGV8cGtpOmdlbmVyYXRlLXRlbXBsYXRlLWNlcnRpZmljYXRlLWF1dGhvcml0eXxwa2k6Z2VuZXJhdGUtY2VydGlmaWNhdGUtcmVxdWVzdHxwa2k6ZGVsZXRlLXRlbXBsYXRlfHBraTpkZWxldGUtY2VydGlmaWNhdGV8cGtpOmNyZWF0ZS10ZW1wbGF0ZXxwZGY6bWFrZS10b2N8cGRmOmluc2VydC10b2MtaGVhZGVyc3xwZGY6Z2V0LXRvY3xwZGY6Y2xlYW58cDpzdGF0dXMtdHJhbnNpdGlvbnxwOnN0YXRlLXRyYW5zaXRpb258cDpyZW1vdmV8cDpwaXBlbGluZXN8cDppbnNlcnR8cDpnZXQtYnktaWR8cDpnZXR8cDpleGVjdXRlfHA6Y3JlYXRlfHA6Y29uZGl0aW9ufHA6Y29sbGVjdGlvbnxwOmFjdGlvbnxvb3htbDpydW5zLW1lcmdlfG9veG1sOnBhY2thZ2UtdXJpc3xvb3htbDpwYWNrYWdlLXBhcnRzLWluc2VydHxvb3htbDpwYWNrYWdlLXBhcnRzfG1zd29yZDpjbGVhbnxtY2dtOnBvbHlnb258bWNnbTpwb2ludHxtY2dtOmdlb3NwYXRpYWwtcXVlcnktZnJvbS1lbGVtZW50c3xtY2dtOmdlb3NwYXRpYWwtcXVlcnl8bWNnbTpjaXJjbGV8bWF0aDp0YW5ofG1hdGg6dGFufG1hdGg6c3FydHxtYXRoOnNpbmh8bWF0aDpzaW58bWF0aDpwb3d8bWF0aDptb2RmfG1hdGg6bG9nMTB8bWF0aDpsb2d8bWF0aDpsZGV4cHxtYXRoOmZyZXhwfG1hdGg6Zm1vZHxtYXRoOmZsb29yfG1hdGg6ZmFic3xtYXRoOmV4cHxtYXRoOmNvc2h8bWF0aDpjb3N8bWF0aDpjZWlsfG1hdGg6YXRhbjJ8bWF0aDphdGFufG1hdGg6YXNpbnxtYXRoOmFjb3N8bWFwOnB1dHxtYXA6bWFwfG1hcDprZXlzfG1hcDpnZXR8bWFwOmRlbGV0ZXxtYXA6Y291bnR8bWFwOmNsZWFyfGxuazp0b3xsbms6cmVtb3ZlfGxuazppbnNlcnR8bG5rOmdldHxsbms6ZnJvbXxsbms6Y3JlYXRlfGttbDpwb2x5Z29ufGttbDpwb2ludHxrbWw6aW50ZXJpb3ItcG9seWdvbnxrbWw6Z2Vvc3BhdGlhbC1xdWVyeS1mcm9tLWVsZW1lbnRzfGttbDpnZW9zcGF0aWFsLXF1ZXJ5fGttbDpjaXJjbGV8a21sOmJveHxnbWw6cG9seWdvbnxnbWw6cG9pbnR8Z21sOmludGVyaW9yLXBvbHlnb258Z21sOmdlb3NwYXRpYWwtcXVlcnktZnJvbS1lbGVtZW50c3xnbWw6Z2Vvc3BhdGlhbC1xdWVyeXxnbWw6Y2lyY2xlfGdtbDpib3h8Z2VvcnNzOnBvaW50fGdlb3JzczpnZW9zcGF0aWFsLXF1ZXJ5fGdlb3JzczpjaXJjbGV8Z2VvOnBvbHlnb258Z2VvOnBvaW50fGdlbzppbnRlcmlvci1wb2x5Z29ufGdlbzpnZW9zcGF0aWFsLXF1ZXJ5LWZyb20tZWxlbWVudHN8Z2VvOmdlb3NwYXRpYWwtcXVlcnl8Z2VvOmNpcmNsZXxnZW86Ym94fGZuOnplcm8tb3Itb25lfGZuOnllYXJzLWZyb20tZHVyYXRpb258Zm46eWVhci1mcm9tLWRhdGVUaW1lfGZuOnllYXItZnJvbS1kYXRlfGZuOnVwcGVyLWNhc2V8Zm46dW5vcmRlcmVkfGZuOnRydWV8Zm46dHJhbnNsYXRlfGZuOnRyYWNlfGZuOnRva2VuaXplfGZuOnRpbWV6b25lLWZyb20tdGltZXxmbjp0aW1lem9uZS1mcm9tLWRhdGVUaW1lfGZuOnRpbWV6b25lLWZyb20tZGF0ZXxmbjpzdW18Zm46c3VidHJhY3QtZGF0ZVRpbWVzLXlpZWxkaW5nLXllYXJNb250aER1cmF0aW9ufGZuOnN1YnRyYWN0LWRhdGVUaW1lcy15aWVsZGluZy1kYXlUaW1lRHVyYXRpb258Zm46c3Vic3RyaW5nLWJlZm9yZXxmbjpzdWJzdHJpbmctYWZ0ZXJ8Zm46c3Vic3RyaW5nfGZuOnN1YnNlcXVlbmNlfGZuOnN0cmluZy10by1jb2RlcG9pbnRzfGZuOnN0cmluZy1wYWR8Zm46c3RyaW5nLWxlbmd0aHxmbjpzdHJpbmctam9pbnxmbjpzdHJpbmd8Zm46c3RhdGljLWJhc2UtdXJpfGZuOnN0YXJ0cy13aXRofGZuOnNlY29uZHMtZnJvbS10aW1lfGZuOnNlY29uZHMtZnJvbS1kdXJhdGlvbnxmbjpzZWNvbmRzLWZyb20tZGF0ZVRpbWV8Zm46cm91bmQtaGFsZi10by1ldmVufGZuOnJvdW5kfGZuOnJvb3R8Zm46cmV2ZXJzZXxmbjpyZXNvbHZlLXVyaXxmbjpyZXNvbHZlLVFOYW1lfGZuOnJlcGxhY2V8Zm46cmVtb3ZlfGZuOlFOYW1lfGZuOnByZWZpeC1mcm9tLVFOYW1lfGZuOnBvc2l0aW9ufGZuOm9uZS1vci1tb3JlfGZuOm51bWJlcnxmbjpub3R8Zm46bm9ybWFsaXplLXVuaWNvZGV8Zm46bm9ybWFsaXplLXNwYWNlfGZuOm5vZGUtbmFtZXxmbjpub2RlLWtpbmR8Zm46bmlsbGVkfGZuOm5hbWVzcGFjZS11cmktZnJvbS1RTmFtZXxmbjpuYW1lc3BhY2UtdXJpLWZvci1wcmVmaXh8Zm46bmFtZXNwYWNlLXVyaXxmbjpuYW1lfGZuOm1vbnRocy1mcm9tLWR1cmF0aW9ufGZuOm1vbnRoLWZyb20tZGF0ZVRpbWV8Zm46bW9udGgtZnJvbS1kYXRlfGZuOm1pbnV0ZXMtZnJvbS10aW1lfGZuOm1pbnV0ZXMtZnJvbS1kdXJhdGlvbnxmbjptaW51dGVzLWZyb20tZGF0ZVRpbWV8Zm46bWlufGZuOm1heHxmbjptYXRjaGVzfGZuOmxvd2VyLWNhc2V8Zm46bG9jYWwtbmFtZS1mcm9tLVFOYW1lfGZuOmxvY2FsLW5hbWV8Zm46bGFzdHxmbjpsYW5nfGZuOmlyaS10by11cml8Zm46aW5zZXJ0LWJlZm9yZXxmbjppbmRleC1vZnxmbjppbi1zY29wZS1wcmVmaXhlc3xmbjppbXBsaWNpdC10aW1lem9uZXxmbjppZHJlZnxmbjppZHxmbjpob3Vycy1mcm9tLXRpbWV8Zm46aG91cnMtZnJvbS1kdXJhdGlvbnxmbjpob3Vycy1mcm9tLWRhdGVUaW1lfGZuOmZsb29yfGZuOmZhbHNlfGZuOmV4cGFuZGVkLVFOYW1lfGZuOmV4aXN0c3xmbjpleGFjdGx5LW9uZXxmbjplc2NhcGUtdXJpfGZuOmVzY2FwZS1odG1sLXVyaXxmbjplcnJvcnxmbjplbmRzLXdpdGh8Zm46ZW5jb2RlLWZvci11cml8Zm46ZW1wdHl8Zm46ZG9jdW1lbnQtdXJpfGZuOmRvYy1hdmFpbGFibGV8Zm46ZG9jfGZuOmRpc3RpbmN0LXZhbHVlc3xmbjpkaXN0aW5jdC1ub2Rlc3xmbjpkZWZhdWx0LWNvbGxhdGlvbnxmbjpkZWVwLWVxdWFsfGZuOmRheXMtZnJvbS1kdXJhdGlvbnxmbjpkYXktZnJvbS1kYXRlVGltZXxmbjpkYXktZnJvbS1kYXRlfGZuOmRhdGF8Zm46Y3VycmVudC10aW1lfGZuOmN1cnJlbnQtZGF0ZVRpbWV8Zm46Y3VycmVudC1kYXRlfGZuOmNvdW50fGZuOmNvbnRhaW5zfGZuOmNvbmNhdHxmbjpjb21wYXJlfGZuOmNvbGxlY3Rpb258Zm46Y29kZXBvaW50cy10by1zdHJpbmd8Zm46Y29kZXBvaW50LWVxdWFsfGZuOmNlaWxpbmd8Zm46Ym9vbGVhbnxmbjpiYXNlLXVyaXxmbjphdmd8Zm46YWRqdXN0LXRpbWUtdG8tdGltZXpvbmV8Zm46YWRqdXN0LWRhdGVUaW1lLXRvLXRpbWV6b25lfGZuOmFkanVzdC1kYXRlLXRvLXRpbWV6b25lfGZuOmFic3xmZWVkOnVuc3Vic2NyaWJlfGZlZWQ6c3Vic2NyaXB0aW9ufGZlZWQ6c3Vic2NyaWJlfGZlZWQ6cmVxdWVzdHxmZWVkOml0ZW18ZmVlZDpkZXNjcmlwdGlvbnxleGNlbDpjbGVhbnxlbnRpdHk6ZW5yaWNofGRvbTpzZXQtcGlwZWxpbmVzfGRvbTpzZXQtcGVybWlzc2lvbnN8ZG9tOnNldC1uYW1lfGRvbTpzZXQtZXZhbHVhdGlvbi1jb250ZXh0fGRvbTpzZXQtZG9tYWluLXNjb3BlfGRvbTpzZXQtZGVzY3JpcHRpb258ZG9tOnJlbW92ZS1waXBlbGluZXxkb206cmVtb3ZlLXBlcm1pc3Npb25zfGRvbTpyZW1vdmV8ZG9tOmdldHxkb206ZXZhbHVhdGlvbi1jb250ZXh0fGRvbTpkb21haW5zfGRvbTpkb21haW4tc2NvcGV8ZG9tOmNyZWF0ZXxkb206Y29uZmlndXJhdGlvbi1zZXQtcmVzdGFydC11c2VyfGRvbTpjb25maWd1cmF0aW9uLXNldC1wZXJtaXNzaW9uc3xkb206Y29uZmlndXJhdGlvbi1zZXQtZXZhbHVhdGlvbi1jb250ZXh0fGRvbTpjb25maWd1cmF0aW9uLXNldC1kZWZhdWx0LWRvbWFpbnxkb206Y29uZmlndXJhdGlvbi1nZXR8ZG9tOmNvbmZpZ3VyYXRpb24tY3JlYXRlfGRvbTpjb2xsZWN0aW9ufGRvbTphZGQtcGlwZWxpbmV8ZG9tOmFkZC1wZXJtaXNzaW9uc3xkbHM6cmV0ZW50aW9uLXJ1bGVzfGRsczpyZXRlbnRpb24tcnVsZS1yZW1vdmV8ZGxzOnJldGVudGlvbi1ydWxlLWluc2VydHxkbHM6cmV0ZW50aW9uLXJ1bGV8ZGxzOnB1cmdlfGRsczpub2RlLWV4cGFuZHxkbHM6bGluay1yZWZlcmVuY2VzfGRsczpsaW5rLWV4cGFuZHxkbHM6ZG9jdW1lbnRzLXF1ZXJ5fGRsczpkb2N1bWVudC12ZXJzaW9ucy1xdWVyeXxkbHM6ZG9jdW1lbnQtdmVyc2lvbi11cml8ZGxzOmRvY3VtZW50LXZlcnNpb24tcXVlcnl8ZGxzOmRvY3VtZW50LXZlcnNpb24tZGVsZXRlfGRsczpkb2N1bWVudC12ZXJzaW9uLWFzLW9mfGRsczpkb2N1bWVudC12ZXJzaW9ufGRsczpkb2N1bWVudC11cGRhdGV8ZGxzOmRvY3VtZW50LXVubWFuYWdlfGRsczpkb2N1bWVudC1zZXQtcXVhbGl0eXxkbHM6ZG9jdW1lbnQtc2V0LXByb3BlcnR5fGRsczpkb2N1bWVudC1zZXQtcHJvcGVydGllc3xkbHM6ZG9jdW1lbnQtc2V0LXBlcm1pc3Npb25zfGRsczpkb2N1bWVudC1zZXQtY29sbGVjdGlvbnN8ZGxzOmRvY3VtZW50LXJldGVudGlvbi1ydWxlc3xkbHM6ZG9jdW1lbnQtcmVtb3ZlLXByb3BlcnRpZXN8ZGxzOmRvY3VtZW50LXJlbW92ZS1wZXJtaXNzaW9uc3xkbHM6ZG9jdW1lbnQtcmVtb3ZlLWNvbGxlY3Rpb25zfGRsczpkb2N1bWVudC1wdXJnZXxkbHM6ZG9jdW1lbnQtbWFuYWdlfGRsczpkb2N1bWVudC1pcy1tYW5hZ2VkfGRsczpkb2N1bWVudC1pbnNlcnQtYW5kLW1hbmFnZXxkbHM6ZG9jdW1lbnQtaW5jbHVkZS1xdWVyeXxkbHM6ZG9jdW1lbnQtaGlzdG9yeXxkbHM6ZG9jdW1lbnQtZ2V0LXBlcm1pc3Npb25zfGRsczpkb2N1bWVudC1leHRyYWN0LXBhcnR8ZGxzOmRvY3VtZW50LWRlbGV0ZXxkbHM6ZG9jdW1lbnQtY2hlY2tvdXQtc3RhdHVzfGRsczpkb2N1bWVudC1jaGVja291dHxkbHM6ZG9jdW1lbnQtY2hlY2tpbnxkbHM6ZG9jdW1lbnQtYWRkLXByb3BlcnRpZXN8ZGxzOmRvY3VtZW50LWFkZC1wZXJtaXNzaW9uc3xkbHM6ZG9jdW1lbnQtYWRkLWNvbGxlY3Rpb25zfGRsczpicmVhay1jaGVja291dHxkbHM6YXV0aG9yLXF1ZXJ5fGRsczphcy1vZi1xdWVyeXxkYms6Y29udmVydHxkYmc6d2FpdHxkYmc6dmFsdWV8ZGJnOnN0b3BwZWR8ZGJnOnN0b3B8ZGJnOnN0ZXB8ZGJnOnN0YXR1c3xkYmc6c3RhY2t8ZGJnOm91dHxkYmc6bmV4dHxkYmc6bGluZXxkYmc6aW52b2tlfGRiZzpmdW5jdGlvbnxkYmc6ZmluaXNofGRiZzpleHByfGRiZzpldmFsfGRiZzpkaXNjb25uZWN0fGRiZzpkZXRhY2h8ZGJnOmNvbnRpbnVlfGRiZzpjb25uZWN0fGRiZzpjbGVhcnxkYmc6YnJlYWtwb2ludHN8ZGJnOmJyZWFrfGRiZzphdHRhY2hlZHxkYmc6YXR0YWNofGN2dDpzYXZlLWNvbnZlcnRlZC1kb2N1bWVudHN8Y3Z0OnBhcnQtdXJpfGN2dDpkZXN0aW5hdGlvbi11cml8Y3Z0OmJhc2VwYXRofGN2dDpiYXNlbmFtZXxjdHM6d29yZHN8Y3RzOndvcmQtcXVlcnktd2VpZ2h0fGN0czp3b3JkLXF1ZXJ5LXRleHR8Y3RzOndvcmQtcXVlcnktb3B0aW9uc3xjdHM6d29yZC1xdWVyeXxjdHM6d29yZC1tYXRjaHxjdHM6d2Fsa3xjdHM6dXJpc3xjdHM6dXJpLW1hdGNofGN0czp0cmFpbnxjdHM6dG9rZW5pemV8Y3RzOnRocmVzaG9sZHN8Y3RzOnN0ZW18Y3RzOnNpbWlsYXItcXVlcnktd2VpZ2h0fGN0czpzaW1pbGFyLXF1ZXJ5LW5vZGVzfGN0czpzaW1pbGFyLXF1ZXJ5fGN0czpzaG9ydGVzdC1kaXN0YW5jZXxjdHM6c2VhcmNofGN0czpzY29yZXxjdHM6cmV2ZXJzZS1xdWVyeS13ZWlnaHR8Y3RzOnJldmVyc2UtcXVlcnktbm9kZXN8Y3RzOnJldmVyc2UtcXVlcnl8Y3RzOnJlbWFpbmRlcnxjdHM6cmVnaXN0ZXJlZC1xdWVyeS13ZWlnaHR8Y3RzOnJlZ2lzdGVyZWQtcXVlcnktb3B0aW9uc3xjdHM6cmVnaXN0ZXJlZC1xdWVyeS1pZHN8Y3RzOnJlZ2lzdGVyZWQtcXVlcnl8Y3RzOnJlZ2lzdGVyfGN0czpxdWVyeXxjdHM6cXVhbGl0eXxjdHM6cHJvcGVydGllcy1xdWVyeS1xdWVyeXxjdHM6cHJvcGVydGllcy1xdWVyeXxjdHM6cG9seWdvbi12ZXJ0aWNlc3xjdHM6cG9seWdvbnxjdHM6cG9pbnQtbG9uZ2l0dWRlfGN0czpwb2ludC1sYXRpdHVkZXxjdHM6cG9pbnR8Y3RzOm9yLXF1ZXJ5LXF1ZXJpZXN8Y3RzOm9yLXF1ZXJ5fGN0czpub3QtcXVlcnktd2VpZ2h0fGN0czpub3QtcXVlcnktcXVlcnl8Y3RzOm5vdC1xdWVyeXxjdHM6bmVhci1xdWVyeS13ZWlnaHR8Y3RzOm5lYXItcXVlcnktcXVlcmllc3xjdHM6bmVhci1xdWVyeS1vcHRpb25zfGN0czpuZWFyLXF1ZXJ5LWRpc3RhbmNlfGN0czpuZWFyLXF1ZXJ5fGN0czpoaWdobGlnaHR8Y3RzOmdlb3NwYXRpYWwtY28tb2NjdXJyZW5jZXN8Y3RzOmZyZXF1ZW5jeXxjdHM6Zml0bmVzc3xjdHM6ZmllbGQtd29yZHN8Y3RzOmZpZWxkLXdvcmQtcXVlcnktd2VpZ2h0fGN0czpmaWVsZC13b3JkLXF1ZXJ5LXRleHR8Y3RzOmZpZWxkLXdvcmQtcXVlcnktb3B0aW9uc3xjdHM6ZmllbGQtd29yZC1xdWVyeS1maWVsZC1uYW1lfGN0czpmaWVsZC13b3JkLXF1ZXJ5fGN0czpmaWVsZC13b3JkLW1hdGNofGN0czplbnRpdHktaGlnaGxpZ2h0fGN0czplbGVtZW50LXdvcmRzfGN0czplbGVtZW50LXdvcmQtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LXdvcmQtcXVlcnktdGV4dHxjdHM6ZWxlbWVudC13b3JkLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeXxjdHM6ZWxlbWVudC13b3JkLW1hdGNofGN0czplbGVtZW50LXZhbHVlc3xjdHM6ZWxlbWVudC12YWx1ZS1yYW5nZXN8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LXZhbHVlLXF1ZXJ5LXRleHR8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnl8Y3RzOmVsZW1lbnQtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtdmFsdWUtZ2Vvc3BhdGlhbC1jby1vY2N1cnJlbmNlc3xjdHM6ZWxlbWVudC12YWx1ZS1jby1vY2N1cnJlbmNlc3xjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnktdmFsdWV8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS1vcGVyYXRvcnxjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnl8Y3RzOmVsZW1lbnQtcXVlcnktcXVlcnl8Y3RzOmVsZW1lbnQtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LXF1ZXJ5fGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC12YWx1ZXN8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXZhbHVlLW1hdGNofGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LXJlZ2lvbnxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktbG9uZ2l0dWRlLW5hbWV8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWxhdGl0dWRlLW5hbWV8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnl8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLWJveGVzfGN0czplbGVtZW50LWdlb3NwYXRpYWwtdmFsdWVzfGN0czplbGVtZW50LWdlb3NwYXRpYWwtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeS1yZWdpb258Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWdlb3NwYXRpYWwtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWdlb3NwYXRpYWwtcXVlcnl8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1ib3hlc3xjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXZhbHVlc3xjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXZhbHVlLW1hdGNofGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktcmVnaW9ufGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5LWNoaWxkLW5hbWV8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeXxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLWJveGVzfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3Jkc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtcXVlcnktdGV4dHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS1hdHRyaWJ1dGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1tYXRjaHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWVzfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1yYW5nZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktdGV4dHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS1hdHRyaWJ1dGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnl8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLW1hdGNofGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1nZW9zcGF0aWFsLWNvLW9jY3VycmVuY2VzfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1jby1vY2N1cnJlbmNlc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS12YWx1ZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktb3BlcmF0b3J8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktYXR0cmlidXRlLW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5fGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtdmFsdWVzfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1yZWdpb258Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnktbG9uZ2l0dWRlLW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1sYXRpdHVkZS1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnl8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1ib3hlc3xjdHM6ZG9jdW1lbnQtcXVlcnktdXJpc3xjdHM6ZG9jdW1lbnQtcXVlcnl8Y3RzOmRpc3RhbmNlfGN0czpkaXJlY3RvcnktcXVlcnktdXJpc3xjdHM6ZGlyZWN0b3J5LXF1ZXJ5LWRlcHRofGN0czpkaXJlY3RvcnktcXVlcnl8Y3RzOmRlc3RpbmF0aW9ufGN0czpkZXJlZ2lzdGVyfGN0czpjb250YWluc3xjdHM6Y29uZmlkZW5jZXxjdHM6Y29sbGVjdGlvbnN8Y3RzOmNvbGxlY3Rpb24tcXVlcnktdXJpc3xjdHM6Y29sbGVjdGlvbi1xdWVyeXxjdHM6Y29sbGVjdGlvbi1tYXRjaHxjdHM6Y2xhc3NpZnl8Y3RzOmNpcmNsZS1yYWRpdXN8Y3RzOmNpcmNsZS1jZW50ZXJ8Y3RzOmNpcmNsZXxjdHM6Ym94LXdlc3R8Y3RzOmJveC1zb3V0aHxjdHM6Ym94LW5vcnRofGN0czpib3gtZWFzdHxjdHM6Ym94fGN0czpiZWFyaW5nfGN0czphcmMtaW50ZXJzZWN0aW9ufGN0czphbmQtcXVlcnktcXVlcmllc3xjdHM6YW5kLXF1ZXJ5LW9wdGlvbnN8Y3RzOmFuZC1xdWVyeXxjdHM6YW5kLW5vdC1xdWVyeS1wb3NpdGl2ZS1xdWVyeXxjdHM6YW5kLW5vdC1xdWVyeS1uZWdhdGl2ZS1xdWVyeXxjdHM6YW5kLW5vdC1xdWVyeXxjc3M6Z2V0fGNzczpjb252ZXJ0fGNwZjpzdWNjZXNzfGNwZjpmYWlsdXJlfGNwZjpkb2N1bWVudC1zZXQtc3RhdGV8Y3BmOmRvY3VtZW50LXNldC1wcm9jZXNzaW5nLXN0YXR1c3xjcGY6ZG9jdW1lbnQtc2V0LWxhc3QtdXBkYXRlZHxjcGY6ZG9jdW1lbnQtc2V0LWVycm9yfGNwZjpkb2N1bWVudC1nZXQtc3RhdGV8Y3BmOmRvY3VtZW50LWdldC1wcm9jZXNzaW5nLXN0YXR1c3xjcGY6ZG9jdW1lbnQtZ2V0LWxhc3QtdXBkYXRlZHxjcGY6ZG9jdW1lbnQtZ2V0LWVycm9yfGNwZjpjaGVjay10cmFuc2l0aW9ufGFsZXJ0OnNwYXduLW1hdGNoaW5nLWFjdGlvbnN8YWxlcnQ6cnVsZS11c2VyLWlkLXF1ZXJ5fGFsZXJ0OnJ1bGUtc2V0LXVzZXItaWR8YWxlcnQ6cnVsZS1zZXQtcXVlcnl8YWxlcnQ6cnVsZS1zZXQtb3B0aW9uc3xhbGVydDpydWxlLXNldC1uYW1lfGFsZXJ0OnJ1bGUtc2V0LWRlc2NyaXB0aW9ufGFsZXJ0OnJ1bGUtc2V0LWFjdGlvbnxhbGVydDpydWxlLXJlbW92ZXxhbGVydDpydWxlLW5hbWUtcXVlcnl8YWxlcnQ6cnVsZS1pbnNlcnR8YWxlcnQ6cnVsZS1pZC1xdWVyeXxhbGVydDpydWxlLWdldC11c2VyLWlkfGFsZXJ0OnJ1bGUtZ2V0LXF1ZXJ5fGFsZXJ0OnJ1bGUtZ2V0LW9wdGlvbnN8YWxlcnQ6cnVsZS1nZXQtbmFtZXxhbGVydDpydWxlLWdldC1pZHxhbGVydDpydWxlLWdldC1kZXNjcmlwdGlvbnxhbGVydDpydWxlLWdldC1hY3Rpb258YWxlcnQ6cnVsZS1hY3Rpb24tcXVlcnl8YWxlcnQ6cmVtb3ZlLXRyaWdnZXJzfGFsZXJ0Om1ha2UtcnVsZXxhbGVydDptYWtlLWxvZy1hY3Rpb258YWxlcnQ6bWFrZS1jb25maWd8YWxlcnQ6bWFrZS1hY3Rpb258YWxlcnQ6aW52b2tlLW1hdGNoaW5nLWFjdGlvbnN8YWxlcnQ6Z2V0LW15LXJ1bGVzfGFsZXJ0OmdldC1hbGwtcnVsZXN8YWxlcnQ6Z2V0LWFjdGlvbnN8YWxlcnQ6ZmluZC1tYXRjaGluZy1ydWxlc3xhbGVydDpjcmVhdGUtdHJpZ2dlcnN8YWxlcnQ6Y29uZmlnLXNldC11cml8YWxlcnQ6Y29uZmlnLXNldC10cmlnZ2VyLWlkc3xhbGVydDpjb25maWctc2V0LW9wdGlvbnN8YWxlcnQ6Y29uZmlnLXNldC1uYW1lfGFsZXJ0OmNvbmZpZy1zZXQtZGVzY3JpcHRpb258YWxlcnQ6Y29uZmlnLXNldC1jcGYtZG9tYWluLW5hbWVzfGFsZXJ0OmNvbmZpZy1zZXQtY3BmLWRvbWFpbi1pZHN8YWxlcnQ6Y29uZmlnLWluc2VydHxhbGVydDpjb25maWctZ2V0LXVyaXxhbGVydDpjb25maWctZ2V0LXRyaWdnZXItaWRzfGFsZXJ0OmNvbmZpZy1nZXQtb3B0aW9uc3xhbGVydDpjb25maWctZ2V0LW5hbWV8YWxlcnQ6Y29uZmlnLWdldC1pZHxhbGVydDpjb25maWctZ2V0LWRlc2NyaXB0aW9ufGFsZXJ0OmNvbmZpZy1nZXQtY3BmLWRvbWFpbi1uYW1lc3xhbGVydDpjb25maWctZ2V0LWNwZi1kb21haW4taWRzfGFsZXJ0OmNvbmZpZy1nZXR8YWxlcnQ6Y29uZmlnLWRlbGV0ZXxhbGVydDphY3Rpb24tc2V0LW9wdGlvbnN8YWxlcnQ6YWN0aW9uLXNldC1uYW1lfGFsZXJ0OmFjdGlvbi1zZXQtbW9kdWxlLXJvb3R8YWxlcnQ6YWN0aW9uLXNldC1tb2R1bGUtZGJ8YWxlcnQ6YWN0aW9uLXNldC1tb2R1bGV8YWxlcnQ6YWN0aW9uLXNldC1kZXNjcmlwdGlvbnxhbGVydDphY3Rpb24tcmVtb3ZlfGFsZXJ0OmFjdGlvbi1pbnNlcnR8YWxlcnQ6YWN0aW9uLWdldC1vcHRpb25zfGFsZXJ0OmFjdGlvbi1nZXQtbmFtZXxhbGVydDphY3Rpb24tZ2V0LW1vZHVsZS1yb290fGFsZXJ0OmFjdGlvbi1nZXQtbW9kdWxlLWRifGFsZXJ0OmFjdGlvbi1nZXQtbW9kdWxlfGFsZXJ0OmFjdGlvbi1nZXQtZGVzY3JpcHRpb258emVyby1vci1vbmV8eWVhcnMtZnJvbS1kdXJhdGlvbnx5ZWFyLWZyb20tZGF0ZVRpbWV8eWVhci1mcm9tLWRhdGV8dXBwZXItY2FzZXx1bm9yZGVyZWR8dHJ1ZXx0cmFuc2xhdGV8dHJhY2V8dG9rZW5pemV8dGltZXpvbmUtZnJvbS10aW1lfHRpbWV6b25lLWZyb20tZGF0ZVRpbWV8dGltZXpvbmUtZnJvbS1kYXRlfHN1bXxzdWJ0cmFjdC1kYXRlVGltZXMteWllbGRpbmcteWVhck1vbnRoRHVyYXRpb258c3VidHJhY3QtZGF0ZVRpbWVzLXlpZWxkaW5nLWRheVRpbWVEdXJhdGlvbnxzdWJzdHJpbmctYmVmb3JlfHN1YnN0cmluZy1hZnRlcnxzdWJzdHJpbmd8c3Vic2VxdWVuY2V8c3RyaW5nLXRvLWNvZGVwb2ludHN8c3RyaW5nLXBhZHxzdHJpbmctbGVuZ3RofHN0cmluZy1qb2lufHN0cmluZ3xzdGF0aWMtYmFzZS11cml8c3RhcnRzLXdpdGh8c2Vjb25kcy1mcm9tLXRpbWV8c2Vjb25kcy1mcm9tLWR1cmF0aW9ufHNlY29uZHMtZnJvbS1kYXRlVGltZXxyb3VuZC1oYWxmLXRvLWV2ZW58cm91bmR8cm9vdHxyZXZlcnNlfHJlc29sdmUtdXJpfHJlc29sdmUtUU5hbWV8cmVwbGFjZXxyZW1vdmV8UU5hbWV8cHJlZml4LWZyb20tUU5hbWV8cG9zaXRpb258b25lLW9yLW1vcmV8bnVtYmVyfG5vdHxub3JtYWxpemUtdW5pY29kZXxub3JtYWxpemUtc3BhY2V8bm9kZS1uYW1lfG5vZGUta2luZHxuaWxsZWR8bmFtZXNwYWNlLXVyaS1mcm9tLVFOYW1lfG5hbWVzcGFjZS11cmktZm9yLXByZWZpeHxuYW1lc3BhY2UtdXJpfG5hbWV8bW9udGhzLWZyb20tZHVyYXRpb258bW9udGgtZnJvbS1kYXRlVGltZXxtb250aC1mcm9tLWRhdGV8bWludXRlcy1mcm9tLXRpbWV8bWludXRlcy1mcm9tLWR1cmF0aW9ufG1pbnV0ZXMtZnJvbS1kYXRlVGltZXxtaW58bWF4fG1hdGNoZXN8bG93ZXItY2FzZXxsb2NhbC1uYW1lLWZyb20tUU5hbWV8bG9jYWwtbmFtZXxsYXN0fGxhbmd8aXJpLXRvLXVyaXxpbnNlcnQtYmVmb3JlfGluZGV4LW9mfGluLXNjb3BlLXByZWZpeGVzfGltcGxpY2l0LXRpbWV6b25lfGlkcmVmfGlkfGhvdXJzLWZyb20tdGltZXxob3Vycy1mcm9tLWR1cmF0aW9ufGhvdXJzLWZyb20tZGF0ZVRpbWV8Zmxvb3J8ZmFsc2V8ZXhwYW5kZWQtUU5hbWV8ZXhpc3RzfGV4YWN0bHktb25lfGVzY2FwZS11cml8ZXNjYXBlLWh0bWwtdXJpfGVycm9yfGVuZHMtd2l0aHxlbmNvZGUtZm9yLXVyaXxlbXB0eXxkb2N1bWVudC11cml8ZG9jLWF2YWlsYWJsZXxkb2N8ZGlzdGluY3QtdmFsdWVzfGRpc3RpbmN0LW5vZGVzfGRlZmF1bHQtY29sbGF0aW9ufGRlZXAtZXF1YWx8ZGF5cy1mcm9tLWR1cmF0aW9ufGRheS1mcm9tLWRhdGVUaW1lfGRheS1mcm9tLWRhdGV8ZGF0YXxjdXJyZW50LXRpbWV8Y3VycmVudC1kYXRlVGltZXxjdXJyZW50LWRhdGV8Y291bnR8Y29udGFpbnN8Y29uY2F0fGNvbXBhcmV8Y29sbGVjdGlvbnxjb2RlcG9pbnRzLXRvLXN0cmluZ3xjb2RlcG9pbnQtZXF1YWx8Y2VpbGluZ3xib29sZWFufGJhc2UtdXJpfGF2Z3xhZGp1c3QtdGltZS10by10aW1lem9uZXxhZGp1c3QtZGF0ZVRpbWUtdG8tdGltZXpvbmV8YWRqdXN0LWRhdGUtdG8tdGltZXpvbmV8YWJzKVxiL10sCitbInBsbiIsL15bXHc6LV0rL10sWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvXV0pLFsieHEiLCJ4cXVlcnkiXSk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvbGFuZy15YW1sLmpzIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmcteWFtbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg3MjliCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L2xhbmcteWFtbC5qcwpAQCAtMCwwICsxLDIgQEAKK3ZhciBhPW51bGw7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInB1biIsL15bOj4/fF0rLyxhLCI6fD4/Il0sWyJkZWMiLC9eJSg/OllBTUx8VEFHKVteXG5cciNdKy8sYSwiJSJdLFsidHlwIiwvXiZcUysvLGEsIiYiXSxbInR5cCIsL14hXFMqLyxhLCIhIl0sWyJzdHIiLC9eIig/OlteIlxcXXxcXC4pKig/OiJ8JCkvLGEsJyInXSxbInN0ciIsL14nKD86W14nXXwnJykqKD86J3wkKS8sYSwiJyJdLFsiY29tIiwvXiNbXlxuXHJdKi8sYSwiIyJdLFsicGxuIiwvXlxzKy8sYSwiIFx0XHJcbiJdXSxbWyJkZWMiLC9eKD86LS0tfFwuXC5cLikoPzpbXG5ccl18JCkvXSxbInB1biIsL14tL10sWyJrd2QiLC9eXHcrOltcblxyIF0vXSxbInBsbiIsL15cdysvXV0pLFsieWFtbCIsInltbCJdKTsKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9wcmV0dGlmeS5jc3MgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvcHJldHRpZnkuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NGIzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy9zdGF0aWMvcHJldHRpZnkvcHJldHRpZnkuY3NzCkBAIC0wLDAgKzEgQEAKKy5wbG57Y29sb3I6IzAwMH1AbWVkaWEgc2NyZWVuey5zdHJ7Y29sb3I6IzA4MH0ua3dke2NvbG9yOiMwMDh9LmNvbXtjb2xvcjojODAwfS50eXB7Y29sb3I6IzYwNn0ubGl0e2NvbG9yOiMwNjZ9LnB1biwub3BuLC5jbG97Y29sb3I6IzY2MH0udGFne2NvbG9yOiMwMDh9LmF0bntjb2xvcjojNjA2fS5hdHZ7Y29sb3I6IzA4MH0uZGVjLC52YXJ7Y29sb3I6IzYwNn0uZnVue2NvbG9yOnJlZH19QG1lZGlhIHByaW50LHByb2plY3Rpb257LnN0cntjb2xvcjojMDYwfS5rd2R7Y29sb3I6IzAwNjtmb250LXdlaWdodDpib2xkfS5jb217Y29sb3I6IzYwMDtmb250LXN0eWxlOml0YWxpY30udHlwe2NvbG9yOiM0MDQ7Zm9udC13ZWlnaHQ6Ym9sZH0ubGl0e2NvbG9yOiMwNDR9LnB1biwub3BuLC5jbG97Y29sb3I6IzQ0MH0udGFne2NvbG9yOiMwMDY7Zm9udC13ZWlnaHQ6Ym9sZH0uYXRue2NvbG9yOiM0MDR9LmF0dntjb2xvcjojMDYwfX1wcmUucHJldHR5cHJpbnR7cGFkZGluZzoycHg7Ym9yZGVyOjFweCBzb2xpZCAjODg4fW9sLmxpbmVudW1ze21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9bGkuTDAsbGkuTDEsbGkuTDIsbGkuTDMsbGkuTDUsbGkuTDYsbGkuTDcsbGkuTDh7bGlzdC1zdHlsZS10eXBlOm5vbmV9bGkuTDEsbGkuTDMsbGkuTDUsbGkuTDcsbGkuTDl7YmFja2dyb3VuZDojZWVlfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9wcmV0dGlmeS5qcyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3N0YXRpYy9wcmV0dGlmeS9wcmV0dGlmeS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvc3RhdGljL3ByZXR0aWZ5L3ByZXR0aWZ5LmpzCkBAIC0wLDAgKzEsMjggQEAKK3ZhciBxPW51bGw7d2luZG93LlBSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OPSEwOworKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gTChhKXtmdW5jdGlvbiBtKGEpe3ZhciBmPWEuY2hhckNvZGVBdCgwKTtpZihmIT09OTIpcmV0dXJuIGY7dmFyIGI9YS5jaGFyQXQoMSk7cmV0dXJuKGY9cltiXSk/ZjoiMCI8PWImJmI8PSI3Ij9wYXJzZUludChhLnN1YnN0cmluZygxKSw4KTpiPT09InUifHxiPT09IngiP3BhcnNlSW50KGEuc3Vic3RyaW5nKDIpLDE2KTphLmNoYXJDb2RlQXQoMSl9ZnVuY3Rpb24gZShhKXtpZihhPDMyKXJldHVybihhPDE2PyJcXHgwIjoiXFx4IikrYS50b1N0cmluZygxNik7YT1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKGE9PT0iXFwifHxhPT09Ii0ifHxhPT09IlsifHxhPT09Il0iKWE9IlxcIithO3JldHVybiBhfWZ1bmN0aW9uIGgoYSl7Zm9yKHZhciBmPWEuc3Vic3RyaW5nKDEsYS5sZW5ndGgtMSkubWF0Y2goL1xcdVtcZEEtRmEtZl17NH18XFx4W1xkQS1GYS1mXXsyfXxcXFswLTNdWzAtN117MCwyfXxcXFswLTddezEsMn18XFxbXFNcc118W15cXF0vZyksYT0KK1tdLGI9W10sbz1mWzBdPT09Il4iLGM9bz8xOjAsaT1mLmxlbmd0aDtjPGk7KytjKXt2YXIgaj1mW2NdO2lmKC9cXFtiZHN3XS9pLnRlc3QoaikpYS5wdXNoKGopO2Vsc2V7dmFyIGo9bShqKSxkO2MrMjxpJiYiLSI9PT1mW2MrMV0/KGQ9bShmW2MrMl0pLGMrPTIpOmQ9ajtiLnB1c2goW2osZF0pO2Q8NjV8fGo+MTIyfHwoZDw2NXx8aj45MHx8Yi5wdXNoKFtNYXRoLm1heCg2NSxqKXwzMixNYXRoLm1pbihkLDkwKXwzMl0pLGQ8OTd8fGo+MTIyfHxiLnB1c2goW01hdGgubWF4KDk3LGopJi0zMyxNYXRoLm1pbihkLDEyMikmLTMzXSkpfX1iLnNvcnQoZnVuY3Rpb24oYSxmKXtyZXR1cm4gYVswXS1mWzBdfHxmWzFdLWFbMV19KTtmPVtdO2o9W05hTixOYU5dO2ZvcihjPTA7YzxiLmxlbmd0aDsrK2MpaT1iW2NdLGlbMF08PWpbMV0rMT9qWzFdPU1hdGgubWF4KGpbMV0saVsxXSk6Zi5wdXNoKGo9aSk7Yj1bIlsiXTtvJiZiLnB1c2goIl4iKTtiLnB1c2guYXBwbHkoYixhKTtmb3IoYz0wO2M8CitmLmxlbmd0aDsrK2MpaT1mW2NdLGIucHVzaChlKGlbMF0pKSxpWzFdPmlbMF0mJihpWzFdKzE+aVswXSYmYi5wdXNoKCItIiksYi5wdXNoKGUoaVsxXSkpKTtiLnB1c2goIl0iKTtyZXR1cm4gYi5qb2luKCIiKX1mdW5jdGlvbiB5KGEpe2Zvcih2YXIgZj1hLnNvdXJjZS5tYXRjaCgvXFsoPzpbXlxcXF1dfFxcW1xTXHNdKSpdfFxcdVtcZEEtRmEtZl17NH18XFx4W1xkQS1GYS1mXXsyfXxcXFxkK3xcXFteXGR1eF18XChcP1shOj1dfFsoKV5dfFteKClbXFxeXSsvZyksYj1mLmxlbmd0aCxkPVtdLGM9MCxpPTA7YzxiOysrYyl7dmFyIGo9ZltjXTtqPT09IigiPysraToiXFwiPT09ai5jaGFyQXQoMCkmJihqPStqLnN1YnN0cmluZygxKSkmJmo8PWkmJihkW2pdPS0xKX1mb3IoYz0xO2M8ZC5sZW5ndGg7KytjKS0xPT09ZFtjXSYmKGRbY109Kyt0KTtmb3IoaT1jPTA7YzxiOysrYylqPWZbY10saj09PSIoIj8oKytpLGRbaV09PT12b2lkIDAmJihmW2NdPSIoPzoiKSk6IlxcIj09PWouY2hhckF0KDApJiYKKyhqPStqLnN1YnN0cmluZygxKSkmJmo8PWkmJihmW2NdPSJcXCIrZFtpXSk7Zm9yKGk9Yz0wO2M8YjsrK2MpIl4iPT09ZltjXSYmIl4iIT09ZltjKzFdJiYoZltjXT0iIik7aWYoYS5pZ25vcmVDYXNlJiZzKWZvcihjPTA7YzxiOysrYylqPWZbY10sYT1qLmNoYXJBdCgwKSxqLmxlbmd0aD49MiYmYT09PSJbIj9mW2NdPWgoaik6YSE9PSJcXCImJihmW2NdPWoucmVwbGFjZSgvW0EtWmEtel0vZyxmdW5jdGlvbihhKXthPWEuY2hhckNvZGVBdCgwKTtyZXR1cm4iWyIrU3RyaW5nLmZyb21DaGFyQ29kZShhJi0zMyxhfDMyKSsiXSJ9KSk7cmV0dXJuIGYuam9pbigiIil9Zm9yKHZhciB0PTAscz0hMSxsPSExLHA9MCxkPWEubGVuZ3RoO3A8ZDsrK3Ape3ZhciBnPWFbcF07aWYoZy5pZ25vcmVDYXNlKWw9ITA7ZWxzZSBpZigvW2Etel0vaS50ZXN0KGcuc291cmNlLnJlcGxhY2UoL1xcdVtcZGEtZl17NH18XFx4W1xkYS1mXXsyfXxcXFteVVh1eF0vZ2ksIiIpKSl7cz0hMDtsPSExO2JyZWFrfX1mb3IodmFyIHI9Cit7Yjo4LHQ6OSxuOjEwLHY6MTEsZjoxMixyOjEzfSxuPVtdLHA9MCxkPWEubGVuZ3RoO3A8ZDsrK3Ape2c9YVtwXTtpZihnLmdsb2JhbHx8Zy5tdWx0aWxpbmUpdGhyb3cgRXJyb3IoIiIrZyk7bi5wdXNoKCIoPzoiK3koZykrIikiKX1yZXR1cm4gUmVnRXhwKG4uam9pbigifCIpLGw/ImdpIjoiZyIpfWZ1bmN0aW9uIE0oYSl7ZnVuY3Rpb24gbShhKXtzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSAxOmlmKGUudGVzdChhLmNsYXNzTmFtZSkpYnJlYWs7Zm9yKHZhciBnPWEuZmlyc3RDaGlsZDtnO2c9Zy5uZXh0U2libGluZyltKGcpO2c9YS5ub2RlTmFtZTtpZigiQlIiPT09Z3x8IkxJIj09PWcpaFtzXT0iXG4iLHRbczw8MV09eSsrLHRbcysrPDwxfDFdPWE7YnJlYWs7Y2FzZSAzOmNhc2UgNDpnPWEubm9kZVZhbHVlLGcubGVuZ3RoJiYoZz1wP2cucmVwbGFjZSgvXHJcbj8vZywiXG4iKTpnLnJlcGxhY2UoL1tcdFxuXHIgXSsvZywiICIpLGhbc109Zyx0W3M8PDFdPXkseSs9Zy5sZW5ndGgsCit0W3MrKzw8MXwxXT1hKX19dmFyIGU9Lyg/Ol58XHMpbm9jb2RlKD86XHN8JCkvLGg9W10seT0wLHQ9W10scz0wLGw7YS5jdXJyZW50U3R5bGU/bD1hLmN1cnJlbnRTdHlsZS53aGl0ZVNwYWNlOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlJiYobD1kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGEscSkuZ2V0UHJvcGVydHlWYWx1ZSgid2hpdGUtc3BhY2UiKSk7dmFyIHA9bCYmInByZSI9PT1sLnN1YnN0cmluZygwLDMpO20oYSk7cmV0dXJue2E6aC5qb2luKCIiKS5yZXBsYWNlKC9cbiQvLCIiKSxjOnR9fWZ1bmN0aW9uIEIoYSxtLGUsaCl7bSYmKGE9e2E6bSxkOmF9LGUoYSksaC5wdXNoLmFwcGx5KGgsYS5lKSl9ZnVuY3Rpb24geChhLG0pe2Z1bmN0aW9uIGUoYSl7Zm9yKHZhciBsPWEuZCxwPVtsLCJwbG4iXSxkPTAsZz1hLmEubWF0Y2goeSl8fFtdLHI9e30sbj0wLHo9Zy5sZW5ndGg7bjx6Oysrbil7dmFyIGY9Z1tuXSxiPXJbZl0sbz12b2lkIDAsYztpZih0eXBlb2YgYj09PQorInN0cmluZyIpYz0hMTtlbHNle3ZhciBpPWhbZi5jaGFyQXQoMCldO2lmKGkpbz1mLm1hdGNoKGlbMV0pLGI9aVswXTtlbHNle2ZvcihjPTA7Yzx0OysrYylpZihpPW1bY10sbz1mLm1hdGNoKGlbMV0pKXtiPWlbMF07YnJlYWt9b3x8KGI9InBsbiIpfWlmKChjPWIubGVuZ3RoPj01JiYibGFuZy0iPT09Yi5zdWJzdHJpbmcoMCw1KSkmJiEobyYmdHlwZW9mIG9bMV09PT0ic3RyaW5nIikpYz0hMSxiPSJzcmMiO2N8fChyW2ZdPWIpfWk9ZDtkKz1mLmxlbmd0aDtpZihjKXtjPW9bMV07dmFyIGo9Zi5pbmRleE9mKGMpLGs9aitjLmxlbmd0aDtvWzJdJiYoaz1mLmxlbmd0aC1vWzJdLmxlbmd0aCxqPWstYy5sZW5ndGgpO2I9Yi5zdWJzdHJpbmcoNSk7QihsK2ksZi5zdWJzdHJpbmcoMCxqKSxlLHApO0IobCtpK2osYyxDKGIsYykscCk7QihsK2krayxmLnN1YnN0cmluZyhrKSxlLHApfWVsc2UgcC5wdXNoKGwraSxiKX1hLmU9cH12YXIgaD17fSx5OyhmdW5jdGlvbigpe2Zvcih2YXIgZT1hLmNvbmNhdChtKSwKK2w9W10scD17fSxkPTAsZz1lLmxlbmd0aDtkPGc7KytkKXt2YXIgcj1lW2RdLG49clszXTtpZihuKWZvcih2YXIgaz1uLmxlbmd0aDstLWs+PTA7KWhbbi5jaGFyQXQoayldPXI7cj1yWzFdO249IiIrcjtwLmhhc093blByb3BlcnR5KG4pfHwobC5wdXNoKHIpLHBbbl09cSl9bC5wdXNoKC9bXFNcc10vKTt5PUwobCl9KSgpO3ZhciB0PW0ubGVuZ3RoO3JldHVybiBlfWZ1bmN0aW9uIHUoYSl7dmFyIG09W10sZT1bXTthLnRyaXBsZVF1b3RlZFN0cmluZ3M/bS5wdXNoKFsic3RyIiwvXig/OicnJyg/OlteJ1xcXXxcXFtcU1xzXXwnJz8oPz1bXiddKSkqKD86JycnfCQpfCIiIig/OlteIlxcXXxcXFtcU1xzXXwiIj8oPz1bXiJdKSkqKD86IiIifCQpfCcoPzpbXidcXF18XFxbXFNcc10pKig/Oid8JCl8Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKSkvLHEsIidcIiJdKTphLm11bHRpTGluZVN0cmluZ3M/bS5wdXNoKFsic3RyIiwvXig/OicoPzpbXidcXF18XFxbXFNcc10pKig/Oid8JCl8Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKXxgKD86W15cXGBdfFxcW1xTXHNdKSooPzpgfCQpKS8sCitxLCInXCJgIl0pOm0ucHVzaChbInN0ciIsL14oPzonKD86W15cblxyJ1xcXXxcXC4pKig/Oid8JCl8Iig/OlteXG5cciJcXF18XFwuKSooPzoifCQpKS8scSwiXCInIl0pO2EudmVyYmF0aW1TdHJpbmdzJiZlLnB1c2goWyJzdHIiLC9eQCIoPzpbXiJdfCIiKSooPzoifCQpLyxxXSk7dmFyIGg9YS5oYXNoQ29tbWVudHM7aCYmKGEuY1N0eWxlQ29tbWVudHM/KGg+MT9tLnB1c2goWyJjb20iLC9eIyg/OiMjKD86W14jXXwjKD8hIyMpKSooPzojIyN8JCl8LiopLyxxLCIjIl0pOm0ucHVzaChbImNvbSIsL14jKD86KD86ZGVmaW5lfGVsaWZ8ZWxzZXxlbmRpZnxlcnJvcnxpZmRlZnxpbmNsdWRlfGlmbmRlZnxsaW5lfHByYWdtYXx1bmRlZnx3YXJuaW5nKVxifFteXG5ccl0qKS8scSwiIyJdKSxlLnB1c2goWyJzdHIiLC9ePCg/Oig/Oig/OlwuXC5cLykqfFwvPykoPzpbXHctXSsoPzpcL1tcdy1dKykrKT9bXHctXStcLmh8W2Etel1cdyopPi8scV0pKTptLnB1c2goWyJjb20iLC9eI1teXG5ccl0qLywKK3EsIiMiXSkpO2EuY1N0eWxlQ29tbWVudHMmJihlLnB1c2goWyJjb20iLC9eXC9cL1teXG5ccl0qLyxxXSksZS5wdXNoKFsiY29tIiwvXlwvXCpbXFNcc10qPyg/OlwqXC98JCkvLHFdKSk7YS5yZWdleExpdGVyYWxzJiZlLnB1c2goWyJsYW5nLXJlZ2V4IiwvXig/Ol5eXC4/fFshKy1dfCE9fCE9PXwjfCV8JT18JnwmJnwmJj18Jj18XCh8XCp8XCo9fFwrPXwsfC09fC0+fFwvfFwvPXw6fDo6fDt8PHw8PHw8PD18PD18PXw9PXw9PT18Pnw+PXw+Pnw+Pj18Pj4+fD4+Pj18Wz9AW15dfFxePXxcXlxefFxeXF49fHt8XHx8XHw9fFx8XHx8XHxcfD18fnxicmVha3xjYXNlfGNvbnRpbnVlfGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZilccyooXC8oPz1bXiovXSkoPzpbXi9bXFxdfFxcW1xTXHNdfFxbKD86W15cXFxdXXxcXFtcU1xzXSkqKD86XXwkKSkrXC8pL10pOyhoPWEudHlwZXMpJiZlLnB1c2goWyJ0eXAiLGhdKTthPSgiIithLmtleXdvcmRzKS5yZXBsYWNlKC9eIHwgJC9nLAorIiIpO2EubGVuZ3RoJiZlLnB1c2goWyJrd2QiLFJlZ0V4cCgiXig/OiIrYS5yZXBsYWNlKC9bXHMsXSsvZywifCIpKyIpXFxiIikscV0pO20ucHVzaChbInBsbiIsL15ccysvLHEsIiBcclxuXHRceGEwIl0pO2UucHVzaChbImxpdCIsL15AWyRfYS16XVtcdyRAXSovaSxxXSxbInR5cCIsL14oPzpbQF9dP1tBLVpdK1thLXpdW1x3JEBdKnxcdytfdFxiKS8scV0sWyJwbG4iLC9eWyRfYS16XVtcdyRAXSovaSxxXSxbImxpdCIsL14oPzoweFtcZGEtZl0rfCg/OlxkKD86X1xkKykqXGQqKD86XC5cZCopP3xcLlxkXCspKD86ZVsrLV0/XGQrKT8pW2Etel0qL2kscSwiMDEyMzQ1Njc4OSJdLFsicGxuIiwvXlxcW1xTXHNdPy8scV0sWyJwdW4iLC9eLlteXHNcdyItJCcuL0BcXGBdKi8scV0pO3JldHVybiB4KG0sZSl9ZnVuY3Rpb24gRChhLG0pe2Z1bmN0aW9uIGUoYSl7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTppZihrLnRlc3QoYS5jbGFzc05hbWUpKWJyZWFrO2lmKCJCUiI9PT1hLm5vZGVOYW1lKWgoYSksCithLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKTtlbHNlIGZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKGEpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6aWYocCl7dmFyIGI9YS5ub2RlVmFsdWUsZD1iLm1hdGNoKHQpO2lmKGQpe3ZhciBjPWIuc3Vic3RyaW5nKDAsZC5pbmRleCk7YS5ub2RlVmFsdWU9YzsoYj1iLnN1YnN0cmluZyhkLmluZGV4K2RbMF0ubGVuZ3RoKSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocy5jcmVhdGVUZXh0Tm9kZShiKSxhLm5leHRTaWJsaW5nKTtoKGEpO2N8fGEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX19fX1mdW5jdGlvbiBoKGEpe2Z1bmN0aW9uIGIoYSxkKXt2YXIgZT1kP2EuY2xvbmVOb2RlKCExKTphLGY9YS5wYXJlbnROb2RlO2lmKGYpe3ZhciBmPWIoZiwxKSxnPWEubmV4dFNpYmxpbmc7Zi5hcHBlbmRDaGlsZChlKTtmb3IodmFyIGg9ZztoO2g9ZylnPWgubmV4dFNpYmxpbmcsZi5hcHBlbmRDaGlsZChoKX1yZXR1cm4gZX0KK2Zvcig7IWEubmV4dFNpYmxpbmc7KWlmKGE9YS5wYXJlbnROb2RlLCFhKXJldHVybjtmb3IodmFyIGE9YihhLm5leHRTaWJsaW5nLDApLGU7KGU9YS5wYXJlbnROb2RlKSYmZS5ub2RlVHlwZT09PTE7KWE9ZTtkLnB1c2goYSl9dmFyIGs9Lyg/Ol58XHMpbm9jb2RlKD86XHN8JCkvLHQ9L1xyXG4/fFxuLyxzPWEub3duZXJEb2N1bWVudCxsO2EuY3VycmVudFN0eWxlP2w9YS5jdXJyZW50U3R5bGUud2hpdGVTcGFjZTp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9cy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGEscSkuZ2V0UHJvcGVydHlWYWx1ZSgid2hpdGUtc3BhY2UiKSk7dmFyIHA9bCYmInByZSI9PT1sLnN1YnN0cmluZygwLDMpO2ZvcihsPXMuY3JlYXRlRWxlbWVudCgiTEkiKTthLmZpcnN0Q2hpbGQ7KWwuYXBwZW5kQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IodmFyIGQ9W2xdLGc9MDtnPGQubGVuZ3RoOysrZyllKGRbZ10pO209PT0obXwwKSYmZFswXS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwKK20pO3ZhciByPXMuY3JlYXRlRWxlbWVudCgiT0wiKTtyLmNsYXNzTmFtZT0ibGluZW51bXMiO2Zvcih2YXIgbj1NYXRoLm1heCgwLG0tMXwwKXx8MCxnPTAsej1kLmxlbmd0aDtnPHo7KytnKWw9ZFtnXSxsLmNsYXNzTmFtZT0iTCIrKGcrbiklMTAsbC5maXJzdENoaWxkfHxsLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoIlx4YTAiKSksci5hcHBlbmRDaGlsZChsKTthLmFwcGVuZENoaWxkKHIpfWZ1bmN0aW9uIGsoYSxtKXtmb3IodmFyIGU9bS5sZW5ndGg7LS1lPj0wOyl7dmFyIGg9bVtlXTtBLmhhc093blByb3BlcnR5KGgpP3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4oImNhbm5vdCBvdmVycmlkZSBsYW5ndWFnZSBoYW5kbGVyICVzIixoKTpBW2hdPWF9fWZ1bmN0aW9uIEMoYSxtKXtpZighYXx8IUEuaGFzT3duUHJvcGVydHkoYSkpYT0vXlxzKjwvLnRlc3QobSk/ImRlZmF1bHQtbWFya3VwIjoiZGVmYXVsdC1jb2RlIjtyZXR1cm4gQVthXX1mdW5jdGlvbiBFKGEpe3ZhciBtPQorYS5nO3RyeXt2YXIgZT1NKGEuaCksaD1lLmE7YS5hPWg7YS5jPWUuYzthLmQ9MDtDKG0saCkoYSk7dmFyIGs9L1xiTVNJRVxiLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLG09L1xuL2csdD1hLmEscz10Lmxlbmd0aCxlPTAsbD1hLmMscD1sLmxlbmd0aCxoPTAsZD1hLmUsZz1kLmxlbmd0aCxhPTA7ZFtnXT1zO3ZhciByLG47Zm9yKG49cj0wO248ZzspZFtuXSE9PWRbbisyXT8oZFtyKytdPWRbbisrXSxkW3IrK109ZFtuKytdKTpuKz0yO2c9cjtmb3Iobj1yPTA7bjxnOyl7Zm9yKHZhciB6PWRbbl0sZj1kW24rMV0sYj1uKzI7YisyPD1nJiZkW2IrMV09PT1mOyliKz0yO2RbcisrXT16O2RbcisrXT1mO249Yn1mb3IoZC5sZW5ndGg9cjtoPHA7KXt2YXIgbz1sW2grMl18fHMsYz1kW2ErMl18fHMsYj1NYXRoLm1pbihvLGMpLGk9bFtoKzFdLGo7aWYoaS5ub2RlVHlwZSE9PTEmJihqPXQuc3Vic3RyaW5nKGUsYikpKXtrJiYoaj1qLnJlcGxhY2UobSwiXHIiKSk7aS5ub2RlVmFsdWU9CitqO3ZhciB1PWkub3duZXJEb2N1bWVudCx2PXUuY3JlYXRlRWxlbWVudCgiU1BBTiIpO3YuY2xhc3NOYW1lPWRbYSsxXTt2YXIgeD1pLnBhcmVudE5vZGU7eC5yZXBsYWNlQ2hpbGQodixpKTt2LmFwcGVuZENoaWxkKGkpO2U8byYmKGxbaCsxXT1pPXUuY3JlYXRlVGV4dE5vZGUodC5zdWJzdHJpbmcoYixvKSkseC5pbnNlcnRCZWZvcmUoaSx2Lm5leHRTaWJsaW5nKSl9ZT1iO2U+PW8mJihoKz0yKTtlPj1jJiYoYSs9Mil9fWNhdGNoKHcpeyJjb25zb2xlImluIHdpbmRvdyYmY29uc29sZS5sb2codyYmdy5zdGFjaz93LnN0YWNrOncpfX12YXIgdj1bImJyZWFrLGNvbnRpbnVlLGRvLGVsc2UsZm9yLGlmLHJldHVybix3aGlsZSJdLHc9W1t2LCJhdXRvLGNhc2UsY2hhcixjb25zdCxkZWZhdWx0LGRvdWJsZSxlbnVtLGV4dGVybixmbG9hdCxnb3RvLGludCxsb25nLHJlZ2lzdGVyLHNob3J0LHNpZ25lZCxzaXplb2Ysc3RhdGljLHN0cnVjdCxzd2l0Y2gsdHlwZWRlZix1bmlvbix1bnNpZ25lZCx2b2lkLHZvbGF0aWxlIl0sCisiY2F0Y2gsY2xhc3MsZGVsZXRlLGZhbHNlLGltcG9ydCxuZXcsb3BlcmF0b3IscHJpdmF0ZSxwcm90ZWN0ZWQscHVibGljLHRoaXMsdGhyb3csdHJ1ZSx0cnksdHlwZW9mIl0sRj1bdywiYWxpZ25vZixhbGlnbl91bmlvbixhc20sYXhpb20sYm9vbCxjb25jZXB0LGNvbmNlcHRfbWFwLGNvbnN0X2Nhc3QsY29uc3RleHByLGRlY2x0eXBlLGR5bmFtaWNfY2FzdCxleHBsaWNpdCxleHBvcnQsZnJpZW5kLGlubGluZSxsYXRlX2NoZWNrLG11dGFibGUsbmFtZXNwYWNlLG51bGxwdHIscmVpbnRlcnByZXRfY2FzdCxzdGF0aWNfYXNzZXJ0LHN0YXRpY19jYXN0LHRlbXBsYXRlLHR5cGVpZCx0eXBlbmFtZSx1c2luZyx2aXJ0dWFsLHdoZXJlIl0sRz1bdywiYWJzdHJhY3QsYm9vbGVhbixieXRlLGV4dGVuZHMsZmluYWwsZmluYWxseSxpbXBsZW1lbnRzLGltcG9ydCxpbnN0YW5jZW9mLG51bGwsbmF0aXZlLHBhY2thZ2Usc3RyaWN0ZnAsc3VwZXIsc3luY2hyb25pemVkLHRocm93cyx0cmFuc2llbnQiXSwKK0g9W0csImFzLGJhc2UsYnksY2hlY2tlZCxkZWNpbWFsLGRlbGVnYXRlLGRlc2NlbmRpbmcsZHluYW1pYyxldmVudCxmaXhlZCxmb3JlYWNoLGZyb20sZ3JvdXAsaW1wbGljaXQsaW4saW50ZXJmYWNlLGludGVybmFsLGludG8saXMsbG9jayxvYmplY3Qsb3V0LG92ZXJyaWRlLG9yZGVyYnkscGFyYW1zLHBhcnRpYWwscmVhZG9ubHkscmVmLHNieXRlLHNlYWxlZCxzdGFja2FsbG9jLHN0cmluZyxzZWxlY3QsdWludCx1bG9uZyx1bmNoZWNrZWQsdW5zYWZlLHVzaG9ydCx2YXIiXSx3PVt3LCJkZWJ1Z2dlcixldmFsLGV4cG9ydCxmdW5jdGlvbixnZXQsbnVsbCxzZXQsdW5kZWZpbmVkLHZhcix3aXRoLEluZmluaXR5LE5hTiJdLEk9W3YsImFuZCxhcyxhc3NlcnQsY2xhc3MsZGVmLGRlbCxlbGlmLGV4Y2VwdCxleGVjLGZpbmFsbHksZnJvbSxnbG9iYWwsaW1wb3J0LGluLGlzLGxhbWJkYSxub25sb2NhbCxub3Qsb3IscGFzcyxwcmludCxyYWlzZSx0cnksd2l0aCx5aWVsZCxGYWxzZSxUcnVlLE5vbmUiXSwKK0o9W3YsImFsaWFzLGFuZCxiZWdpbixjYXNlLGNsYXNzLGRlZixkZWZpbmVkLGVsc2lmLGVuZCxlbnN1cmUsZmFsc2UsaW4sbW9kdWxlLG5leHQsbmlsLG5vdCxvcixyZWRvLHJlc2N1ZSxyZXRyeSxzZWxmLHN1cGVyLHRoZW4sdHJ1ZSx1bmRlZix1bmxlc3MsdW50aWwsd2hlbix5aWVsZCxCRUdJTixFTkQiXSx2PVt2LCJjYXNlLGRvbmUsZWxpZixlc2FjLGV2YWwsZmksZnVuY3Rpb24saW4sbG9jYWwsc2V0LHRoZW4sdW50aWwiXSxLPS9eKERJUnxGSUxFfHZlY3RvcnwoZGV8cHJpb3JpdHlfKT9xdWV1ZXxsaXN0fHN0YWNrfChjb25zdF8pP2l0ZXJhdG9yfChtdWx0aSk/KHNldHxtYXApfGJpdHNldHx1PyhpbnR8ZmxvYXQpXGQqKS8sTj0vXFMvLE89dSh7a2V5d29yZHM6W0YsSCx3LCJjYWxsZXIsZGVsZXRlLGRpZSxkbyxkdW1wLGVsc2lmLGV2YWwsZXhpdCxmb3JlYWNoLGZvcixnb3RvLGlmLGltcG9ydCxsYXN0LGxvY2FsLG15LG5leHQsbm8sb3VyLHByaW50LHBhY2thZ2UscmVkbyxyZXF1aXJlLHN1Yix1bmRlZix1bmxlc3MsdW50aWwsdXNlLHdhbnRhcnJheSx3aGlsZSxCRUdJTixFTkQiKworSSxKLHZdLGhhc2hDb21tZW50czohMCxjU3R5bGVDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxBPXt9O2soTyxbImRlZmF1bHQtY29kZSJdKTtrKHgoW10sW1sicGxuIiwvXltePD9dKy9dLFsiZGVjIiwvXjwhXHdbXj5dKig/Oj58JCkvXSxbImNvbSIsL148XCEtLVtcU1xzXSo/KD86LS1cPnwkKS9dLFsibGFuZy0iLC9ePFw/KFtcU1xzXSs/KSg/Olw/PnwkKS9dLFsibGFuZy0iLC9ePCUoW1xTXHNdKz8pKD86JT58JCkvXSxbInB1biIsL14oPzo8WyU/XXxbJT9dPikvXSxbImxhbmctIiwvXjx4bXBcYltePl0qPihbXFNcc10rPyk8XC94bXBcYltePl0qPi9pXSxbImxhbmctanMiLC9ePHNjcmlwdFxiW14+XSo+KFtcU1xzXSo/KSg8XC9zY3JpcHRcYltePl0qPikvaV0sWyJsYW5nLWNzcyIsL148c3R5bGVcYltePl0qPihbXFNcc10qPykoPFwvc3R5bGVcYltePl0qPikvaV0sWyJsYW5nLWluLnRhZyIsL14oPFwvP1thLXpdW148Pl0qPikvaV1dKSwKK1siZGVmYXVsdC1tYXJrdXAiLCJodG0iLCJodG1sIiwibXhtbCIsInhodG1sIiwieG1sIiwieHNsIl0pO2soeChbWyJwbG4iLC9eXHMrLyxxLCIgXHRcclxuIl0sWyJhdHYiLC9eKD86IlteIl0qIj98J1teJ10qJz8pLyxxLCJcIiciXV0sW1sidGFnIiwvXl48XC8/W2Etel0oPzpbXHctLjpdKlx3KT98XC8/PiQvaV0sWyJhdG4iLC9eKD8hc3R5bGVbXHM9XXxvbilbYS16XSg/OltcdzotXSpcdyk/L2ldLFsibGFuZy11cS52YWwiLC9ePVxzKihbXlxzIic+XSooPzpbXlxzIicvPl18XC8oPz1ccykpKS9dLFsicHVuIiwvXlsvPC0+XSsvXSxbImxhbmctanMiLC9eb25cdytccyo9XHMqIihbXiJdKykiL2ldLFsibGFuZy1qcyIsL15vblx3K1xzKj1ccyonKFteJ10rKScvaV0sWyJsYW5nLWpzIiwvXm9uXHcrXHMqPVxzKihbXlxzIic+XSspL2ldLFsibGFuZy1jc3MiLC9ec3R5bGVccyo9XHMqIihbXiJdKykiL2ldLFsibGFuZy1jc3MiLC9ec3R5bGVccyo9XHMqJyhbXiddKyknL2ldLFsibGFuZy1jc3MiLAorL15zdHlsZVxzKj1ccyooW15ccyInPl0rKS9pXV0pLFsiaW4udGFnIl0pO2soeChbXSxbWyJhdHYiLC9eW1xTXHNdKy9dXSksWyJ1cS52YWwiXSk7ayh1KHtrZXl3b3JkczpGLGhhc2hDb21tZW50czohMCxjU3R5bGVDb21tZW50czohMCx0eXBlczpLfSksWyJjIiwiY2MiLCJjcHAiLCJjeHgiLCJjeWMiLCJtIl0pO2sodSh7a2V5d29yZHM6Im51bGwsdHJ1ZSxmYWxzZSJ9KSxbImpzb24iXSk7ayh1KHtrZXl3b3JkczpILGhhc2hDb21tZW50czohMCxjU3R5bGVDb21tZW50czohMCx2ZXJiYXRpbVN0cmluZ3M6ITAsdHlwZXM6S30pLFsiY3MiXSk7ayh1KHtrZXl3b3JkczpHLGNTdHlsZUNvbW1lbnRzOiEwfSksWyJqYXZhIl0pO2sodSh7a2V5d29yZHM6dixoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMH0pLFsiYnNoIiwiY3NoIiwic2giXSk7ayh1KHtrZXl3b3JkczpJLGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwLHRyaXBsZVF1b3RlZFN0cmluZ3M6ITB9KSwKK1siY3YiLCJweSJdKTtrKHUoe2tleXdvcmRzOiJjYWxsZXIsZGVsZXRlLGRpZSxkbyxkdW1wLGVsc2lmLGV2YWwsZXhpdCxmb3JlYWNoLGZvcixnb3RvLGlmLGltcG9ydCxsYXN0LGxvY2FsLG15LG5leHQsbm8sb3VyLHByaW50LHBhY2thZ2UscmVkbyxyZXF1aXJlLHN1Yix1bmRlZix1bmxlc3MsdW50aWwsdXNlLHdhbnRhcnJheSx3aGlsZSxCRUdJTixFTkQiLGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbInBlcmwiLCJwbCIsInBtIl0pO2sodSh7a2V5d29yZHM6SixoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksWyJyYiJdKTtrKHUoe2tleXdvcmRzOncsY1N0eWxlQ29tbWVudHM6ITAscmVnZXhMaXRlcmFsczohMH0pLFsianMiXSk7ayh1KHtrZXl3b3JkczoiYWxsLGFuZCxieSxjYXRjaCxjbGFzcyxlbHNlLGV4dGVuZHMsZmFsc2UsZmluYWxseSxmb3IsaWYsaW4saXMsaXNudCxsb29wLG5ldyxubyxub3QsbnVsbCxvZixvZmYsb24sb3IscmV0dXJuLHN1cGVyLHRoZW4sdHJ1ZSx0cnksdW5sZXNzLHVudGlsLHdoZW4sd2hpbGUseWVzIiwKK2hhc2hDb21tZW50czozLGNTdHlsZUNvbW1lbnRzOiEwLG11bHRpbGluZVN0cmluZ3M6ITAsdHJpcGxlUXVvdGVkU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksWyJjb2ZmZWUiXSk7ayh4KFtdLFtbInN0ciIsL15bXFNcc10rL11dKSxbInJlZ2V4Il0pO3dpbmRvdy5wcmV0dHlQcmludE9uZT1mdW5jdGlvbihhLG0sZSl7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiUFJFIik7aC5pbm5lckhUTUw9YTtlJiZEKGgsZSk7RSh7ZzptLGk6ZSxoOmh9KTtyZXR1cm4gaC5pbm5lckhUTUx9O3dpbmRvdy5wcmV0dHlQcmludD1mdW5jdGlvbihhKXtmdW5jdGlvbiBtKCl7Zm9yKHZhciBlPXdpbmRvdy5QUl9TSE9VTERfVVNFX0NPTlRJTlVBVElPTj9sLm5vdygpKzI1MDpJbmZpbml0eTtwPGgubGVuZ3RoJiZsLm5vdygpPGU7cCsrKXt2YXIgbj1oW3BdLGs9bi5jbGFzc05hbWU7aWYoay5pbmRleE9mKCJwcmV0dHlwcmludCIpPj0wKXt2YXIgaz1rLm1hdGNoKGcpLGYsYjtpZihiPQorIWspe2I9bjtmb3IodmFyIG89dm9pZCAwLGM9Yi5maXJzdENoaWxkO2M7Yz1jLm5leHRTaWJsaW5nKXZhciBpPWMubm9kZVR5cGUsbz1pPT09MT9vP2I6YzppPT09Mz9OLnRlc3QoYy5ub2RlVmFsdWUpP2I6bzpvO2I9KGY9bz09PWI/dm9pZCAwOm8pJiYiQ09ERSI9PT1mLnRhZ05hbWV9YiYmKGs9Zi5jbGFzc05hbWUubWF0Y2goZykpO2smJihrPWtbMV0pO2I9ITE7Zm9yKG89bi5wYXJlbnROb2RlO287bz1vLnBhcmVudE5vZGUpaWYoKG8udGFnTmFtZT09PSJwcmUifHxvLnRhZ05hbWU9PT0iY29kZSJ8fG8udGFnTmFtZT09PSJ4bXAiKSYmby5jbGFzc05hbWUmJm8uY2xhc3NOYW1lLmluZGV4T2YoInByZXR0eXByaW50Iik+PTApe2I9ITA7YnJlYWt9Ynx8KChiPShiPW4uY2xhc3NOYW1lLm1hdGNoKC9cYmxpbmVudW1zXGIoPzo6KFxkKykpPy8pKT9iWzFdJiZiWzFdLmxlbmd0aD8rYlsxXTohMDohMSkmJkQobixiKSxkPXtnOmssaDpuLGk6Yn0sRShkKSl9fXA8aC5sZW5ndGg/c2V0VGltZW91dChtLAorMjUwKTphJiZhKCl9Zm9yKHZhciBlPVtkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJlIiksZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvZGUiKSxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgieG1wIildLGg9W10saz0wO2s8ZS5sZW5ndGg7KytrKWZvcih2YXIgdD0wLHM9ZVtrXS5sZW5ndGg7dDxzOysrdCloLnB1c2goZVtrXVt0XSk7dmFyIGU9cSxsPURhdGU7bC5ub3d8fChsPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9fSk7dmFyIHA9MCxkLGc9L1xibGFuZyg/OnVhZ2UpPy0oW1x3Ll0rKSg/IVxTKS87bSgpfTt3aW5kb3cuUFI9e2NyZWF0ZVNpbXBsZUxleGVyOngscmVnaXN0ZXJMYW5nSGFuZGxlcjprLHNvdXJjZURlY29yYXRvcjp1LFBSX0FUVFJJQl9OQU1FOiJhdG4iLFBSX0FUVFJJQl9WQUxVRToiYXR2IixQUl9DT01NRU5UOiJjb20iLFBSX0RFQ0xBUkFUSU9OOiJkZWMiLFBSX0tFWVdPUkQ6Imt3ZCIsUFJfTElURVJBTDoibGl0IiwKK1BSX05PQ09ERToibm9jb2RlIixQUl9QTEFJTjoicGxuIixQUl9QVU5DVFVBVElPTjoicHVuIixQUl9TT1VSQ0U6InNyYyIsUFJfU1RSSU5HOiJzdHIiLFBSX1RBRzoidGFnIixQUl9UWVBFOiJ0eXAifX0pKCk7CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvQ29tbW9uLnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Db21tb24uc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTdkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvQ29tbW9uLnNveQpAQCAtMCwwICsxLDk1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIENvbW1vbiBoZWFkZXIgZm9yIEdpdGlsZXMuCisgKgorICogQHBhcmFtIHRpdGxlIHRpdGxlIGZvciB0aGlzIHBhZ2UuIEFsd2F5cyBzdWZmaXhlZCB3aXRoIHJlcG9zaXRvcnkgbmFtZSBhbmQgYQorICogICAgIHNpdGV3aWRlIHRpdGxlLgorICogQHBhcmFtPyByZXBvc2l0b3J5TmFtZSByZXBvc2l0b3J5IG5hbWUgZm9yIHRoaXMgcGFnZSwgaWYgYXBwbGljYWJsZS4KKyAqIEBwYXJhbT8gbWVudUVudHJpZXMgb3B0aW9uYWwgbGlzdCBvZiBtZW51IGVudHJpZXMgd2l0aCAidGV4dCIgYW5kIG9wdGlvbmFsCisgKiAgICAgInVybCIga2V5cy4KKyAqIEBwYXJhbSBicmVhZGNydW1icyBuYXZpZ2F0aW9uIGJyZWFkY3J1bWJzIGZvciB0aGlzIHBhZ2UuCisgKiBAcGFyYW0/IGNzcyBvcHRpb25hbCBsaXN0IG9mIENTUyBVUkxzIHRvIGluY2x1ZGUuCisgKiBAcGFyYW0/IGpzIG9wdGlvbmFsIGxpc3Qgb2YgSmF2YXNjcmlwdCBVUkxzIHRvIGluY2x1ZGUuCisgKiBAcGFyYW0/IG9uTG9hZCBvcHRpb25hbCBKYXZhc2NyaXB0IHRvIGV4ZWN1dGUgaW4gdGhlIGJvZHkncyBvbkxvYWQgaGFuZGxlci4KKyAqICAgICBXYXJuaW5nOiBub3QgYXV0b2VzY2FwZWQuCisgKi8KK3t0ZW1wbGF0ZSAuaGVhZGVyfQorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorICA8dGl0bGU+CisgICAgeyR0aXRsZX0KKyAgICB7aWYgJHJlcG9zaXRvcnlOYW1lfQorICAgICAge3NwfS0geyRyZXBvc2l0b3J5TmFtZX0KKyAgICB7L2lmfQorICAgIHtzcH0tIHttc2cgZGVzYz0ibmFtZSBvZiB0aGUgYXBwbGljYXRpb24ifUdpdCBhdCBHb29nbGV7L21zZ30KKyAgPC90aXRsZT4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLy93d3cuZ29vZ2xlLmNvbS9jc3MvZ28uY3NzIiAvPgorCisgIHtpZiAkY3NzIGFuZCBsZW5ndGgoJGNzcyl9CisgICAge2ZvcmVhY2ggJHVybCBpbiAkY3NzfQorICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ieyR1cmx9IiAvPgorICAgIHsvZm9yZWFjaH0KKyAgey9pZn0KKyAgLy8gSW5jbHVkZSBkZWZhdWx0IENTUyBhZnRlciBjdXN0b20gQ1NTIHNvIGl0IGNhbiBvdmVycmlkZSBkZWZhdWx0cyBpbiB0aGlyZC0KKyAgLy8gcGFydHkgc3R5bGVzaGVldHMgKGUuZy4gcHJldHRpZnkpLgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJ7Z2l0aWxlcy5DU1NfVVJMfSIgLz4KKworICB7aWYgJGpzIGFuZCBsZW5ndGgoJGpzKX0KKyAgICB7Zm9yZWFjaCAkdXJsIGluICRqc30KKyAgICAgIDxzY3JpcHQgc3JjPSJ7JHVybH0iIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgey9mb3JlYWNofQorICB7L2lmfQorPC9oZWFkPgorPGJvZHkge2lmICRvbkxvYWR9b25sb2FkPSJ7JG9uTG9hZHxpZH0iey9pZn0+CisgIHtjYWxsIC5jdXN0b21IZWFkZXIgL30KKworICB7aWYgJG1lbnVFbnRyaWVzIGFuZCBsZW5ndGgoJG1lbnVFbnRyaWVzKX0KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICB7Zm9yZWFjaCAkZW50cnkgaW4gJG1lbnVFbnRyaWVzfQorICAgICAge3NwfQorICAgICAge2lmICRlbnRyeS51cmx9CisgICAgICAgIDxhIGhyZWY9InskZW50cnkudXJsfSJ7aWYgbm90IGlzTGFzdCgkZW50cnkpfSBjbGFzcz0iZW50cnkiey9pZn0+eyRlbnRyeS50ZXh0fTwvYT4KKyAgICAgIHtlbHNlfQorICAgICAgICA8c3BhbntpZiBub3QgaXNMYXN0KCRlbnRyeSl9IGNsYXNzPSJlbnRyeSJ7L2lmfT57JGVudHJ5LnRleHR9PC9zcGFuPgorICAgICAgey9pZn0KKyAgICB7L2ZvcmVhY2h9CisgICAge3NwfQorICAgIDwvZGl2PgorICB7L2lmfQorCisgIHtpZiAkYnJlYWRjcnVtYnMgYW5kIGxlbmd0aCgkYnJlYWRjcnVtYnMpfQorICAgIDxkaXYgY2xhc3M9ImJyZWFkY3J1bWJzIj4KKyAgICAgIHtmb3JlYWNoICRlbnRyeSBpbiAkYnJlYWRjcnVtYnN9CisgICAgICAgIHtpZiBub3QgaXNGaXJzdCgkZW50cnkpfXtzcH0ve3NwfXsvaWZ9CisgICAgICAgIHtpZiBub3QgaXNMYXN0KCRlbnRyeSl9CisgICAgICAgICAgPGEgaHJlZj0ieyRlbnRyeS51cmx9Ij57JGVudHJ5LnRleHR9PC9hPgorICAgICAgICB7ZWxzZX0KKyAgICAgICAgICB7JGVudHJ5LnRleHR9CisgICAgICAgIHsvaWZ9CisgICAgICB7L2ZvcmVhY2h9CisgICAgPC9kaXY+CisgIHsvaWZ9Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIFN0YW5kYXJkIGZvb3Rlci4KKyAqLwore3RlbXBsYXRlIC5mb290ZXJ9Cis8L2JvZHk+Cis8L2h0bWw+Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0RlZmF1bHRDdXN0b21UZW1wbGF0ZXMuc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0RlZmF1bHRDdXN0b21UZW1wbGF0ZXMuc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjVkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvRGVmYXVsdEN1c3RvbVRlbXBsYXRlcy5zb3kKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBEZWZhdWx0IGN1c3RvbSBoZWFkZXIgaW1wbGVtZW50YXRpb24gZm9yIEdpdGlsZXMuCisgKi8KK3t0ZW1wbGF0ZSAuY3VzdG9tSGVhZGVyfQorPGgxPnttc2cgZGVzYz0ic2hvcnQgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24ifUdpdGlsZXN7L21zZ308L2gxPgorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9EaWZmRGV0YWlsLnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9EaWZmRGV0YWlsLnNveQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQ4YWYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0RpZmZEZXRhaWwuc295CkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogRGV0YWlsIHBhZ2Ugc2hvd2luZyBkaWZmcyBmb3IgYSBzaW5nbGUgY29tbWl0LgorICoKKyAqIEBwYXJhbSB0aXRsZSBodW1hbi1yZWFkYWJsZSByZXZpc2lvbiBuYW1lLgorICogQHBhcmFtIHJlcG9zaXRvcnlOYW1lIG5hbWUgb2YgdGhpcyByZXBvc2l0b3J5LgorICogQHBhcmFtPyBtZW51RW50cmllcyBtZW51IGVudHJpZXMuCisgKiBAcGFyYW0gYnJlYWRjcnVtYnMgYnJlYWRjcnVtYnMgZm9yIHRoaXMgcGFnZS4KKyAqIEBwYXJhbT8gY29tbWl0IG9wdGlvbmFsIGNvbW1pdCBmb3Igd2hpY2ggZGlmZnMgYXJlIGRpc3BsYXllZCwgd2l0aCBrZXlzCisgKiAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l0aWxlcy5jb21taXREZXRhaWwgdGVtcGxhdGUgKG1pbnVzICJkaWZmVHJlZSIpLgorICovCit7dGVtcGxhdGUgLmRpZmZEZXRhaWx9Cit7Y2FsbCAuaGVhZGVyIGRhdGE9ImFsbCIgL30KKwore2lmICRjb21taXR9CisgIHtjYWxsIC5jb21taXREZXRhaWwgZGF0YT0iJGNvbW1pdCIgL30KK3svaWZ9Cis8ZGl2IGlkPSJESUZGX09VVFBVVF9CTE9DSyIgLz4KKwore2NhbGwgLmZvb3RlciAvfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBGaWxlIGhlYWRlciBmb3IgYSBzaW5nbGUgdW5pZmllZCBkaWZmIHBhdGNoLgorICoKKyAqIEBwYXJhbSBmaXJzdCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgaGVhZGVyLCB3aXRoIG5vIHRyYWlsaW5nIExGLgorICogQHBhcmFtIHJlc3QgcmVtYWluaW5nIGxpbmVzIG9mIHRoZSBoZWFkZXIsIGlmIGFueS4KKyAqIEBwYXJhbSBmaWxlSW5kZXggcG9zaXRpb24gb2YgdGhlIGZpbGUgd2l0aGluIHRoZSBkaWZmZXJlbmNlLgorICovCit7dGVtcGxhdGUgLmRpZmZIZWFkZXJ9Cis8cHJlIGNsYXNzPSJkaWZmLWhlYWRlciI+Cis8YSBuYW1lPSJGeyRmaWxlSW5kZXh9IiBjbGFzcz0iZGlmZi1naXQiPnskZmlyc3R9PC9hPntcbn0KK3skcmVzdH0KKzwvcHJlPgorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Ib3N0SW5kZXguc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL0hvc3RJbmRleC5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlOTYxNgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Ib3N0SW5kZXguc295CkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogSFRNTCBwYWdlIGZvciAvLgorICoKKyAqIEBwYXJhbSBob3N0TmFtZSBob3N0IG5hbWUuCisgKiBAcGFyYW0/IG1lbnVFbnRyaWVzIG1lbnUgZW50cmllcy4KKyAqIEBwYXJhbSBiYXNlVXJsIGJhc2UgVVJMIGZvciByZXBvc2l0b3JpZXMuCisgKiBAcGFyYW0gcmVwb3NpdG9yaWVzIGxpc3Qgb2YgcmVwb3NpdG9yeSBkZXNjcmlwdGlvbiBtYXBzIHdpdGggbmFtZSwgY2xvbmVVcmwsCisgKiAgICAgYW5kIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHZhbHVlcy4KKyAqLwore3RlbXBsYXRlIC5ob3N0SW5kZXh9Cit7Y2FsbCAuaGVhZGVyfQorICB7cGFyYW0gdGl0bGU6ICRob3N0TmFtZSA/ICRob3N0TmFtZSArICcgR2l0IHJlcG9zaXRvcmllcycgOiAnR2l0IHJlcG9zaXRvcmllcycgL30KKyAge3BhcmFtIG1lbnVFbnRyaWVzOiAkbWVudUVudHJpZXMgL30KKyAge3BhcmFtIGJyZWFkY3J1bWJzOiBudWxsIC99Cit7L2NhbGx9CisKK3tpZiBsZW5ndGgoJHJlcG9zaXRvcmllcyl9CisKKyAgPGgyPgorICAgIHttc2cgZGVzYz0iR2l0IHJlcG9zaXRvcmllcyBhdmFpbGFibGUgb24gdGhlIGhvc3QifQorICAgICAgeyRob3N0TmFtZX0gR2l0IHJlcG9zaXRvcmllcworICAgIHsvbXNnfQorICA8L2gyPgorCisgIDxkaXYgY2xhc3M9Imluc3RydWN0aW9ucyI+CisgICAge21zZyBkZXNjPSJkZXNjcmlwdGlvbiBvbiBob3cgdG8gdXNlIHRoaXMgcmVwb3NpdG9yeSJ9CisgICAgVG8gY2xvbmUgb25lIG9mIHRoZXNlIHJlcG9zaXRvcmllcywgaW5zdGFsbHtzcH0KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmdpdC1zY20uY29tLyI+Z2l0PC9hPiwgYW5kIHJ1bjoKKyAgICA8cHJlPmdpdCBjbG9uZSB7JGJhc2VVcmx9PGVtPm5hbWU8L2VtPjwvcHJlPgorICAgIHsvbXNnfQorICA8L2Rpdj4KKworICA8dGFibGUgY2xhc3M9Imxpc3QiPgorICAgIDx0ciBjbGFzcz0ibm8taG92ZXIiPgorICAgICAgPHRoIHdpZHRoPSIyNSUiPgorICAgICAgICB7bXNnIGRlc2M9ImNvbHVtbiBoZWFkZXIgZm9yIHJlcG9zaXRvcnkgbmFtZSJ9CisgICAgICAgICAgTmFtZQorICAgICAgICB7L21zZ30KKyAgICAgIDwvdGg+CisgICAgICA8dGg+CisgICAgICAgIHttc2cgZGVzYz0iY29sdW1uIGhlYWRlciBmb3IgcmVwb3NpdG9yeSBkZXNjcmlwdGlvbiJ9CisgICAgICAgICAgRGVzY3JpcHRpb24KKyAgICAgICAgey9tc2d9CisgICAgICA8L3RoPgorICAgIDwvdHI+CisgICAge2ZvcmVhY2ggJHJlcG8gaW4gJHJlcG9zaXRvcmllc30KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDxhIGhyZWY9InskcmVwby51cmx9Ij57JHJlcG8ubmFtZX08L2E+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD57JHJlcG8uZGVzY3JpcHRpb259PC90ZD4KKyAgICAgIDwvdHI+CisgICAgey9mb3JlYWNofQorICA8L3RhYmxlPgorICA8ZGl2IGNsYXNzPSJmb290ZXIiPgorICAgIDxhIGhyZWY9Ij9mb3JtYXQ9VEVYVCI+e21zZyBkZXNjPSJ0ZXh0IGZvcm1hdCJ9VFhUey9tc2d9PC9hPgorICAgIHtzcH0KKyAgICA8YSBocmVmPSI/Zm9ybWF0PUpTT04iPnttc2cgZGVzYz0iSlNPTiBmb3JtYXQifUpTT057L21zZ308L2E+CisgIDwvZGl2Pgorey9pZn0KK3tjYWxsIC5mb290ZXIgL30KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvTG9nRGV0YWlsLnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9Mb2dEZXRhaWwuc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YWU5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvTG9nRGV0YWlsLnNveQpAQCAtMCwwICsxLDk1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIERldGFpbCBwYWdlIHNob3dpbmcgYSBzaG9ydGxvZyBmb3IgYSBjb21taXQuCisgKgorICogQHBhcmFtIHRpdGxlIGh1bWFuLXJlYWRhYmxlIHJldmlzaW9uIG5hbWUuCisgKiBAcGFyYW0gcmVwb3NpdG9yeU5hbWUgbmFtZSBvZiB0aGlzIHJlcG9zaXRvcnkuCisgKiBAcGFyYW0/IG1lbnVFbnRyaWVzIG1lbnUgZW50cmllcy4KKyAqIEBwYXJhbSBicmVhZGNydW1icyBicmVhZGNydW1icyBmb3IgdGhpcyBwYWdlLgorICogQHBhcmFtPyB0YWdzIG9wdGlvbmFsIGxpc3Qgb2YgdGFncyBlbmNvdW50ZXJlZCB3aGVuIHBlZWxpbmcgdGhpcyBvYmplY3QsIHdpdGgKKyAqICAgICBrZXlzIGNvcnJlc3BvbmRpbmcgdG8gZ2l0aWxlcy50YWdEZXRhaWwuCisgKiBAcGFyYW0gZW50cmllcyBsaXN0IG9mIGxvZyBlbnRyaWVzOyBzZWUgLmxvZ0VudHJ5LgorICogQHBhcmFtPyBuZXh0VXJsIFVSTCBmb3IgdGhlIG5leHQgcGFnZSBvZiByZXN1bHRzLgorICogQHBhcmFtPyBwcmV2aW91c1VybCBVUkwgZm9yIHRoZSBwcmV2aW91cyBwYWdlIG9mIHJlc3VsdHMuCisgKi8KK3t0ZW1wbGF0ZSAubG9nRGV0YWlsfQore2NhbGwgLmhlYWRlciBkYXRhPSJhbGwiIC99CisKK3tpZiAkdGFnc30KKyAge2ZvcmVhY2ggJHRhZyBpbiAkdGFnc30KKyAgICB7Y2FsbCBnaXRpbGVzLnRhZ0RldGFpbCBkYXRhPSIkdGFnIiAvfQorICB7L2ZvcmVhY2h9Cit7L2lmfQorCit7aWYgJHByZXZpb3VzVXJsfQorICA8ZGl2IGNsYXNzPSJsb2ctbmF2Ij4KKyAgICA8YSBocmVmPSJ7JHByZXZpb3VzVXJsfSI+e21zZyBkZXNjPSJ0ZXh0IGZvciBwcmV2aW91cyBVUkwifSZsYXF1bzsgUHJldmlvdXN7L21zZ308L2E+CisgIDwvZGl2Pgorey9pZn0KKwore2lmIGxlbmd0aCgkZW50cmllcyl9CisgIDxvbCBjbGFzcz0ic2hvcnRsb2ciPgorICAgIHtmb3JlYWNoICRlbnRyeSBpbiAkZW50cmllc30KKyAgICAgIDxsaXtpZiAkcHJldmlvdXNVcmwgYW5kIGlzRmlyc3QoJGVudHJ5KX0gY2xhc3M9ImZpcnN0InsvaWZ9PgorICAgICAgICB7Y2FsbCAubG9nRW50cnkgZGF0YT0iJGVudHJ5IiAvfQorICAgICAgPC9saT4KKyAgICB7L2ZvcmVhY2h9CisgIDwvb2w+Cit7ZWxzZX0KKyAgPHA+e21zZyBkZXNjPSJpbmZvcm1hdGlvbmFsIHRleHQgZm9yIHdoZW4gdGhlIGxvZyBpcyBlbXB0eSJ9Tm8gY29tbWl0cy57L21zZ308L3A+Cit7L2lmfQorCit7aWYgJG5leHRVcmx9CisgIDxkaXYgY2xhc3M9ImxvZy1uYXYiPgorICAgIDxhIGhyZWY9InskbmV4dFVybH0iPnttc2cgZGVzYz0idGV4dCBmb3IgbmV4dCBVUkwifU5leHQgJnJhcXVvO3svbXNnfTwvYT4KKyAgPC9kaXY+Cit7L2lmfQorCit7Y2FsbCAuZm9vdGVyIC99Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIFNpbmdsZSBzaG9ydGxvZyBlbnRyeS4KKyAqCisgKiBAcGFyYW0gYWJicmV2U2hhIGFiYnJldmlhdGVkIFNIQS0xLgorICogQHBhcmFtIHVybCBVUkwgdG8gY29tbWl0IGRldGFpbCBwYWdlLgorICogQHBhcmFtIHNob3J0TWVzc2FnZSBzaG9ydCBjb21taXQgbWVzc2FnZS4KKyAqIEBwYXJhbSBhdXRob3IgYXV0aG9yIGluZm9ybWF0aW9uIHdpdGggYXQgbGVhc3QgIm5hbWUiIGFuZCAicmVsYXRpdmVUaW1lIiBrZXlzLgorICogQHBhcmFtIGJyYW5jaGVzIGxpc3Qgb2YgYnJhbmNoZXMgZm9yIHRoaXMgZW50cnksIHdpdGggIm5hbWUiIGFuZCAidXJsIiBrZXlzLgorICogQHBhcmFtIHRhZ3MgbGlzdCBvZiB0YWdzIGZvciB0aGlzIGVudHJ5LCB3aXRoICJuYW1lIiBhbmQgInVybCIga2V5cy4KKyAqLwore3RlbXBsYXRlIC5sb2dFbnRyeX0KKzxhIGhyZWY9InskdXJsfSI+CisgIDxzcGFuIGNsYXNzPSJzaGExIj57JGFiYnJldlNoYX08L3NwYW4+CisgIC8vIG5ic3AgaW5zdGFkIG9mIENTUyBwYWRkaW5nL21hcmdpbiBiZWNhdXNlIHRob3NlIGNhdXNlIGEgYnJlYWsgaW4gdGhlCisgIC8vIHVuZGVybGluZS4KKyAgJm5ic3A7CisgIHtzcH08c3BhbiBjbGFzcz0iY29tbWl0LW1lc3NhZ2UiPnskc2hvcnRNZXNzYWdlfTwvc3Bhbj4KKzwvYT4KK3tzcH08c3BhbiBjbGFzcz0iYXV0aG9yIj57bXNnIGRlc2M9ImNvbW1pdCBhdXRob3IgbmFtZSJ9YnkgeyRhdXRob3IubmFtZX17L21zZ308L3NwYW4+Cit7c3B9PHNwYW4gY2xhc3M9InRpbWUiPi0geyRhdXRob3IucmVsYXRpdmVUaW1lfTwvc3Bhbj4KK3tpZiBsZW5ndGgoJGJyYW5jaGVzKX0KKyAge2ZvcmVhY2ggJGJyYW5jaCBpbiAkYnJhbmNoZXN9CisgICAge3NwfTxhIGhyZWY9InskYnJhbmNoLnVybH0iIGNsYXNzPSJicmFuY2gtbGFiZWwiPnskYnJhbmNoLm5hbWV9PC9hPgorICB7L2ZvcmVhY2h9Cit7L2lmfQore2lmIGxlbmd0aCgkdGFncyl9CisgIHtmb3JlYWNoICR0YWcgaW4gJHRhZ3N9CisgICAge3NwfTxhIGhyZWY9InskdGFnLnVybH0iIGNsYXNzPSJ0YWctbGFiZWwiPnskdGFnLm5hbWV9PC9hPgorICB7L2ZvcmVhY2h9Cit7L2lmfQorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9PYmplY3REZXRhaWwuc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL09iamVjdERldGFpbC5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkZjQzYwotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9PYmplY3REZXRhaWwuc295CkBAIC0wLDAgKzEsMjk0IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgore25hbWVzcGFjZSBnaXRpbGVzIGF1dG9lc2NhcGU9ImNvbnRleHR1YWwifQorCisvKioKKyAqIERldGFpbGVkIGxpc3Rpbmcgb2YgYSBjb21taXQuCisgKgorICogQHBhcmFtIGF1dGhvciBtYXAgd2l0aCAibmFtZSIsICJlbWFpbCIsIGFuZCAidGltZSIga2V5cyBmb3IgdGhlIGNvbW1pdCBhdXRob3IuCisgKiBAcGFyYW0gY29tbWl0dGVyIG1hcCB3aXRoICJuYW1lIiwgImVtYWlsIiwgYW5kICJ0aW1lIiBrZXlzIGZvciB0aGUgY29tbWl0dGVyLgorICogQHBhcmFtIHNoYSBjb21taXQgU0hBLTEuCisgKiBAcGFyYW0gdHJlZSB0cmVlIFNIQS0xLgorICogQHBhcmFtIHRyZWVVcmwgdHJlZSBVUkwuCisgKiBAcGFyYW0gcGFyZW50cyBsaXN0IG9mIHBhcmVudCBvYmplY3RzIHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOgorICogICAgIHNoYTogU0hBLTEuCisgKiAgICAgdXJsOiBVUkwgdG8gdmlldyB0aGUgcGFyZW50IGNvbW1pdC4KKyAqICAgICBkaWZmVXJsOiBVUkwgdG8gZGlzcGxheSBkaWZmcyByZWxhdGl2ZSB0byB0aGlzIHBhcmVudC4KKyAqIEBwYXJhbSBtZXNzYWdlIGxpc3Qgb2YgY29tbWl0IG1lc3NhZ2UgcGFydHMsIHdoZXJlIGVhY2ggcGFydCBjb250YWluczoKKyAqICAgICB0ZXh0OiByYXcgdGV4dCBvZiB0aGUgcGFydC4KKyAqICAgICB1cmw6IG9wdGlvbmFsIFVSTCB0aGF0IHNob3VsZCBiZSBsaW5rZWQgdG8gZnJvbSB0aGUgcGFydC4KKyAqIEBwYXJhbSBkaWZmVHJlZSBsaXN0IG9mIGNoYW5nZWQgdHJlZSBlbnRyaWVzIHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOgorICogICAgIGNoYW5nZVR5cGU6IHN0cmluZyBtYXRjaGluZyBhbiBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LkNoYW5nZVR5cGUKKyAqICAgICAgICAgY29uc3RhbnQuCisgKiAgICAgcGF0aDogKG5ldykgcGF0aCBvZiB0aGUgdHJlZSBlbnRyeS4KKyAqICAgICBvbGRQYXRoOiBvbGQgcGF0aCwgb25seSBmb3IgcmVuYW1lcyBhbmQgY29waWVzLgorICogICAgIHVybDogVVJMIHRvIGEgZGV0YWlsIHBhZ2UgZm9yIHRoZSB0cmVlIGVudHJ5LgorICogICAgIGRpZmZVcmw6IFVSTCB0byBhIGRpZmYgcGFnZSBmb3IgdGhlIHRyZWUgZW50cnkncyBkaWZmIGluIHRoaXMgY29tbWl0LgorICogQHBhcmFtIGxvZ1VybCBVUkwgdG8gYSBsb2cgcGFnZSBzdGFydGluZyBhdCB0aGlzIGNvbW1pdC4KKyAqLwore3RlbXBsYXRlIC5jb21taXREZXRhaWx9Cis8ZGl2IGNsYXNzPSJnaXQtY29tbWl0Ij4KKyAgPHRhYmxlPgorICAgIDx0cj4KKyAgICAgIDx0aD57bXNnIGRlc2M9IkhlYWRlciBmb3IgY29tbWl0IFNIQSBlbnRyeSJ9Y29tbWl0ey9tc2d9PC90aD4KKyAgICAgIDx0ZCBjbGFzcz0ic2hhIj4KKyAgICAgICAgeyRzaGF9CisgICAgICAgIDxzcGFuIGNsYXNzPSJsb2ctbGluayI+CisgICAgICAgICAgWzxhIGhyZWY9InskbG9nVXJsfSI+e21zZyBkZXNjPSJ0ZXh0IGZvciB0aGUgbG9nIGxpbmsifWxvZ3svbXNnfTwvYT5dCisgICAgICAgIDwvc3Bhbj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQ+e3NwfTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGg+e21zZyBkZXNjPSJIZWFkZXIgZm9yIGNvbW1pdCBhdXRob3IifWF1dGhvcnsvbXNnfTwvdGg+CisgICAgICA8dGQ+e2NhbGwgLnBlcnNvbl8gZGF0YT0iJGF1dGhvciIgL308L3RkPgorICAgICAgPHRkPnskYXV0aG9yLnRpbWV9PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0aD57bXNnIGRlc2M9IkhlYWRlciBmb3IgY29tbWl0dGVyIn1jb21taXR0ZXJ7L21zZ308L3RoPgorICAgICAgPHRkPntjYWxsIC5wZXJzb25fIGRhdGE9IiRjb21taXR0ZXIiIC99PC90ZD4KKyAgICAgIDx0ZD57JGNvbW1pdHRlci50aW1lfTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGg+e21zZyBkZXNjPSJIZWFkZXIgZm9yIHRyZWUgU0hBIGVudHJ5In10cmVley9tc2d9PC90aD4KKyAgICAgIDx0ZCBjbGFzcz0ic2hhIj48YSBocmVmPSJ7JHRyZWVVcmx9Ij57JHRyZWV9PC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICB7Zm9yZWFjaCAkcGFyZW50IGluICRwYXJlbnRzfQorICAgICAgPHRyPgorICAgICAgICA8dGg+e21zZyBkZXNjPSJIZWFkZXIgZm9yIHBhcmVudCBTSEEifXBhcmVudHsvbXNnfTwvdGg+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8YSBocmVmPSJ7JHBhcmVudC51cmx9Ij57JHBhcmVudC5zaGF9PC9hPgorICAgICAgICAgIDxzcGFuIGNsYXNzPSJkaWZmLWxpbmsiPgorICAgICAgICAgICAgWzxhIGhyZWY9InskcGFyZW50LmRpZmZVcmx9Ij57bXNnIGRlc2M9InRleHQgZm9yIHRoZSBwYXJlbnQgZGlmZiBsaW5rIn1kaWZmey9tc2d9PC9hPl0KKyAgICAgICAgICA8L3NwYW4+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgIHsvZm9yZWFjaH0KKyAgPC90YWJsZT4KKzwvZGl2Pgore2NhbGwgLm1lc3NhZ2VffQorICB7cGFyYW0gY2xhc3NOYW1lOiAnY29tbWl0LW1lc3NhZ2UnIC99CisgIHtwYXJhbSBtZXNzYWdlOiAkbWVzc2FnZSAvfQorey9jYWxsfQorCit7aWYgJGRpZmZUcmVlIGFuZCBsZW5ndGgoJGRpZmZUcmVlKX0KKyAgPHVsIGNsYXNzPSJkaWZmLXRyZWUiPgorICAgIHtmb3JlYWNoICRlbnRyeSBpbiAkZGlmZlRyZWV9CisgICAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9InskZW50cnkudXJsfSI+eyRlbnRyeS5wYXRofTwvYT4KKyAgICAgICAge3N3aXRjaCAkZW50cnkuY2hhbmdlVHlwZX0KKyAgICAgICAgICB7Y2FzZSAnQUREJ30KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhZGQiPgorICAgICAgICAgICAgICB7bXNnIGRlc2M9IlRleHQgZm9yIGEgbmV3IHRyZWUgZW50cnkifQorICAgICAgICAgICAgICAgIFtBZGRlZCAtIDxhIGhyZWY9InskZW50cnkuZGlmZlVybH0iPmRpZmY8L2E+XQorICAgICAgICAgICAgICB7L21zZ30KKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICB7Y2FzZSAnTU9ESUZZJ30KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtb2RpZnkiPgorICAgICAgICAgICAgICB7bXNnIGRlc2M9IlRleHQgZm9yIGEgbW9kaWZpZWQgdHJlZSBlbnRyeSJ9CisgICAgICAgICAgICAgICAgWzxhIGhyZWY9InskZW50cnkuZGlmZlVybH0iPmRpZmY8L2E+XQorICAgICAgICAgICAgICB7L21zZ30KKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICB7Y2FzZSAnREVMRVRFJ30KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWxldGUiPgorICAgICAgICAgICAgICB7bXNnIGRlc2M9IlRleHQgZm9yIGEgZGVsZXRlZCB0cmVlIGVudHJ5In0KKyAgICAgICAgICAgICAgICBbRGVsZXRlZCAtIDxhIGhyZWY9InskZW50cnkuZGlmZlVybH0iPmRpZmY8L2E+XQorICAgICAgICAgICAgICB7L21zZ30KKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICB7Y2FzZSAnUkVOQU1FJ30KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJyZW5hbWUiPgorICAgICAgICAgICAgICB7bXNnIGRlc2M9IlRleHQgZm9yIGEgcmVuYW1lZCB0cmVlIGVudHJ5In0KKyAgICAgICAgICAgICAgICBbUmVuYW1lZCBmcm9tIHskZW50cnkub2xkUGF0aH0gLSA8YSBocmVmPSJ7JGVudHJ5LmRpZmZVcmx9Ij5kaWZmPC9hPl0KKyAgICAgICAgICAgICAgey9tc2d9CisgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAge2Nhc2UgJ0NPUFknfQorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvcHkiPgorICAgICAgICAgICAgICB7bXNnIGRlc2M9IlRleHQgZm9yIGEgY29waWVkIHRyZWUgZW50cnkifQorICAgICAgICAgICAgICAgIFtDb3BpZWQgZnJvbSB7JGVudHJ5Lm9sZFBhdGh9IC0gPGEgaHJlZj0ieyRlbnRyeS5kaWZmVXJsfSI+ZGlmZjwvYT5dCisgICAgICAgICAgICAgIHsvbXNnfQorICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgIHtkZWZhdWx0fQorICAgICAgICB7L3N3aXRjaH0KKyAgICAgIDwvbGk+CisgICAgey9mb3JlYWNofQorICA8L3VsPgorICA8ZGl2IGNsYXNzPSJkaWZmLXN1bW1hcnkiPgorICAgIHtpZiBsZW5ndGgoJGRpZmZUcmVlKSA9PSAxfQorICAgICAge21zZyBkZXNjPSIxIGZpbGUgY2hhbmdlZCJ9MSBmaWxlIGNoYW5nZWR7L21zZ30KKyAgICB7ZWxzZX0KKyAgICAgIHttc2cgZGVzYz0ibnVtYmVyIG9mIGZpbGVzIGNoYW5nZWQifXtsZW5ndGgoJGRpZmZUcmVlKX0gZmlsZXMgY2hhbmdlZHsvbXNnfQorICAgIHsvaWZ9CisgIDwvZGl2Pgorey9pZn0KKworey90ZW1wbGF0ZX0KKworLyoqCisgKiBEZXRhaWxlZCBsaXN0aW5nIG9mIGEgdHJlZS4KKyAqCisgKiBAcGFyYW0gc2hhIFNIQSBvZiB0aGlzIHBhdGgncyB0cmVlLgorICogQHBhcmFtPyBsb2dVcmwgb3B0aW9uYWwgVVJMIHRvIGEgbG9nIGZvciB0aGlzIHBhdGguCisgKiBAcGFyYW0gZW50cmllcyBsaXN0IG9mIGVudHJpZXMgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6CisgKiAgICAgdHlwZTogZW50cnkgdHlwZSwgbWF0Y2hpbmcgb25lIG9mIHRoZSBjb25zdGFudCBuYW1lcyBkZWZpbmVkIGluCisgKiAgICAgICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlLgorICogICAgIG5hbWU6IHRyZWUgZW50cnkgbmFtZS4KKyAqICAgICB1cmw6IFVSTCB0byBsaW5rIHRvLgorICogICAgIHRhcmdldE5hbWU6IG5hbWUgb2YgYSBzeW1saW5rIHRhcmdldCwgcmVxdWlyZWQgb25seSBpZiB0eXBlID09ICdTWU1MSU5LJy4KKyAqICAgICB0YXJnZXRVcmw6IG9wdGlvbmFsIHVybCBvZiBhIHN5bWxpbmsgdGFyZ2V0LCByZXF1aXJlZCBvbmx5IGlmCisgKiAgICAgICAgIHR5cGUgPT0gJ1NZTUxJTksnLgorICovCit7dGVtcGxhdGUgLnRyZWVEZXRhaWx9Cis8ZGl2IGNsYXNzPSJzaGExIj4KKyAge21zZyBkZXNjPSJTSEEtMSBmb3IgdGhlIHBhdGgncyB0cmVlIn10cmVlOiB7JHNoYX17L21zZ30KKyAge2lmICRsb2dVcmx9e3NwfVs8YSBocmVmPSJ7JGxvZ1VybH0iPnttc2cgZGVzYz0iaGlzdG9yeSBmb3IgYSBwYXRoIn1wYXRoIGhpc3Rvcnl7L21zZ308L2E+XXsvaWZ9Cis8L2Rpdj4KKwore2lmIGxlbmd0aCgkZW50cmllcyl9CisgIDxvbCBjbGFzcz0ibGlzdCBmaWxlcyI+CisgICAge2ZvcmVhY2ggJGVudHJ5IGluICRlbnRyaWVzfQorICAgICAgPGxpIGNsYXNzPSIKKyAgICAgICAgICAgIHtzd2l0Y2ggJGVudHJ5LnR5cGV9CisgICAgICAgICAgICAgIHtjYXNlICdUUkVFJ31naXQtdHJlZQorICAgICAgICAgICAgICB7Y2FzZSAnU1lNTElOSyd9c3ltbGluaworICAgICAgICAgICAgICB7Y2FzZSAnUkVHVUxBUl9GSUxFJ31yZWd1bGFyLWZpbGUKKyAgICAgICAgICAgICAge2Nhc2UgJ0VYRUNVVEFCTEVfRklMRSd9ZXhlY3V0YWJsZS1maWxlCisgICAgICAgICAgICAgIHtjYXNlICdHSVRMSU5LJ31naXRsaW5rCisgICAgICAgICAgICAgIHtkZWZhdWx0fXJlZ3VsYXItZmlsZQorICAgICAgICAgICAgey9zd2l0Y2h9CisgICAgICAgICAgICAiIHRpdGxlPSIKKyAgICAgICAgICAgIHtzd2l0Y2ggJGVudHJ5LnR5cGV9CisgICAgICAgICAgICAgIHtjYXNlICdUUkVFJ317bXNnIGRlc2M9IkFsdCB0ZXh0IGZvciB0cmVlIGljb24ifVRyZWV7L21zZ30KKyAgICAgICAgICAgICAge2Nhc2UgJ1NZTUxJTksnfXttc2cgZGVzYz0iQWx0IHRleHQgZm9yIHN5bWxpbmsgaWNvbiJ9U3ltbGlua3svbXNnfQorICAgICAgICAgICAgICB7Y2FzZSAnUkVHVUxBUl9GSUxFJ317bXNnIGRlc2M9IkFsdCB0ZXh0IGZvciByZWd1bGFyIGZpbGUgaWNvbiJ9UmVndWxhciBmaWxley9tc2d9CisgICAgICAgICAgICAgIHtjYXNlICdFWEVDVVRBQkxFX0ZJTEUnfQorICAgICAgICAgICAgICAgIHttc2cgZGVzYz0iQWx0IHRleHQgZm9yIGV4ZWN1dGFibGUgZmlsZSBpY29uIn1FeGVjdXRhYmxlIGZpbGV7L21zZ30KKyAgICAgICAgICAgICAge2Nhc2UgJ0dJVExJTksnfQorICAgICAgICAgICAgICAgIHttc2cgZGVzYz0iQWx0IHRleHQgZm9yIGdpdCBzdWJtb2R1bGUgbGluayBpY29uIn1HaXQgc3VibW9kdWxlIGxpbmt7L21zZ30KKyAgICAgICAgICAgICAge2RlZmF1bHR9e21zZyBkZXNjPSJBbHQgdGV4dCBmb3Igb3RoZXIgZmlsZSBpY29uIn1PdGhlcnsvbXNnfQorICAgICAgICAgICAgey9zd2l0Y2h9CisgICAgICAgICAgICAtIHskZW50cnkubmFtZX0iPgorICAgICAgICA8YSBocmVmPSJ7JGVudHJ5LnVybH0iPnskZW50cnkubmFtZX08L2E+CisgICAgICAgIHtpZiAkZW50cnkudHlwZSA9PSAnU1lNTElOSyd9CisgICAgICAgICAge3NwfSYjeDIxZTg7e3NwfQorICAgICAgICAgIHtpZiAkZW50cnkudGFyZ2V0VXJsfQorICAgICAgICAgICAgPGEgaHJlZj0ieyRlbnRyeS50YXJnZXRVcmx9Ij57JGVudHJ5LnRhcmdldE5hbWV9PC9hPgorICAgICAgICAgIHtlbHNlfQorICAgICAgICAgICAgeyRlbnRyeS50YXJnZXROYW1lfQorICAgICAgICAgIHsvaWZ9CisgICAgICAgIHsvaWZ9CisgICAgICAgIC8vIFRPRE8oZGJvcm93aXR6KTogU29tZXRoaW5nIHJlYXNvbmFibGUgZm9yIGdpdGxpbmtzLgorICAgICAgPC9saT4KKyAgICB7L2ZvcmVhY2h9CisgIDwvdGFibGU+Cit7ZWxzZX0KKyAgPHA+e21zZyBkZXNjPSJJbmZvcm1hdGlvbmFsIHRleHQgZm9yIHdoZW4gYSB0cmVlIGlzIGVtcHR5In1UaGlzIHRyZWUgaXMgZW1wdHkuey9tc2d9PC9wPgorey9pZn0KK3svdGVtcGxhdGV9CisKKy8qKgorICogRGV0YWlsZWQgbGlzdGluZyBvZiBhIGJsb2IuCisgKgorICogQHBhcmFtIHNoYSBTSEEgb2YgdGhpcyBmaWxlJ3MgYmxvYi4KKyAqIEBwYXJhbT8gbG9nVXJsIG9wdGlvbmFsIFVSTCB0byBhIGxvZyBmb3IgdGhpcyBmaWxlLgorICogQHBhcmFtIGRhdGEgZmlsZSBkYXRhIChtYXkgYmUgZW1wdHkpLCBvciBudWxsIGZvciBhIGJpbmFyeSBmaWxlLgorICogQHBhcmFtPyBsYW5nIHByZXR0eXByaW50IGxhbmd1YWdlIGV4dGVuc2lvbiBmb3IgdGV4dCBmaWxlLgorICogQHBhcmFtPyBzaXplIGZvciBiaW5hcnkgZmlsZXMgb25seSwgc2l6ZSBpbiBieXRlcy4KKyAqLwore3RlbXBsYXRlIC5ibG9iRGV0YWlsfQorPGRpdiBjbGFzcz0ic2hhMSI+CisgIHttc2cgZGVzYz0iU0hBLTEgZm9yIHRoZSBmaWxlJ3MgYmxvYiJ9YmxvYjogeyRzaGF9ey9tc2d9CisgIHtpZiAkbG9nVXJsfXtzcH1bPGEgaHJlZj0ieyRsb2dVcmx9Ij57bXNnIGRlc2M9Imhpc3RvcnkgZm9yIGEgZmlsZSJ9ZmlsZSBoaXN0b3J5ey9tc2d9PC9hPl17L2lmfQorPC9kaXY+CisKK3tpZiAkZGF0YSAhPSBudWxsfQorICB7aWYgJGRhdGF9CisgICAge2lmICRsYW5nICE9IG51bGx9CisgICAgICA8cHJlIGNsYXNzPSJnaXQtYmxvYiBwcmV0dHlwcmludCBsaW5lbnVtcyBsYW5nLXskbGFuZ30iPnskZGF0YX08L3ByZT4KKyAgICB7ZWxzZX0KKyAgICAgIDxwcmUgY2xhc3M9ImdpdC1ibG9iIj57JGRhdGF9PC9wcmU+CisgICAgey9pZn0KKyAge2Vsc2V9CisgICAgPGRpdiBjbGFzcz0iZmlsZS1lbXB0eSI+RW1wdHkgZmlsZTwvZGl2PgorICB7L2lmfQore2Vsc2V9CisgIDxkaXYgY2xhc3M9ImZpbGUtYmluYXJ5Ij4KKyAgICB7bXNnIGRlc2M9InNpemUgb2YgYmluYXJ5IGZpbGUgaW4gYnl0ZXMifXskc2l6ZX0tYnl0ZSBiaW5hcnkgZmlsZXsvbXNnfQorICA8L2Rpdj4KK3svaWZ9Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIERldGFpbGVkIGxpc3Rpbmcgb2YgYW4gYW5ub3RhdGVkIHRhZy4KKyAqCisgKiBAcGFyYW0gc2hhIFNIQSBvZiB0aGlzIHRhZy4KKyAqIEBwYXJhbT8gdGFnZ2VyIG9wdGlvbmFsIG1hcCB3aXRoICJuYW1lIiwgImVtYWlsIiwgYW5kICJ0aW1lIiBrZXlzIGZvciB0aGUKKyAqICAgICB0YWdnZXIuCisgKiBAcGFyYW0gb2JqZWN0IFNIQSBvZiB0aGUgb2JqZWN0IHRoaXMgdGFnIHBvaW50cyB0by4KKyAqIEBwYXJhbSBtZXNzYWdlIHRhZyBtZXNzYWdlLgorICovCit7dGVtcGxhdGUgLnRhZ0RldGFpbH0KKzxkaXYgY2xhc3M9ImdpdC10YWciPgorICA8dGFibGU+CisgICAgPHRyPgorICAgICAgPHRoPnttc2cgZGVzYz0iSGVhZGVyIGZvciB0YWcgU0hBIGVudHJ5In10YWd7L21zZ308L3RoPgorICAgICAgPHRkIGNsYXNzPSJzaGEiPnskc2hhfTwvdGQ+CisgICAgICA8dGQ+e3NwfTwvdGQ+CisgICAgPC90cj4KKyAgICB7aWYgJHRhZ2dlcn0KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoPnttc2cgZGVzYz0iSGVhZGVyIGZvciB0YWdnZXIifXRhZ2dlcnsvbXNnfTwvdGg+CisgICAgICAgIDx0ZD57Y2FsbCAucGVyc29uXyBkYXRhPSIkdGFnZ2VyIiAvfTwvdGQ+CisgICAgICAgIDx0ZD57JHRhZ2dlci50aW1lfTwvdGQ+CisgICAgICA8L3RyPgorICAgIHsvaWZ9CisgICAgPHRyPgorICAgICAgPHRoPnttc2cgZGVzYz0iSGVhZGVyIGZvciB0YWdnZWQgb2JqZWN0IFNIQSJ9b2JqZWN0ey9tc2d9PC90aD4KKyAgICAgIDx0ZCBjbGFzcz0ic2hhIj57JG9iamVjdH08L3RkPgorICAgICAgPHRkPntzcH08L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+Cis8L2Rpdj4KK3tpZiAkbWVzc2FnZSBhbmQgbGVuZ3RoKCRtZXNzYWdlKX0KKyAge2NhbGwgLm1lc3NhZ2VffQorICAgIHtwYXJhbSBjbGFzc05hbWU6ICd0YWctbWVzc2FnZScgL30KKyAgICB7cGFyYW0gbWVzc2FnZTogJG1lc3NhZ2UgL30KKyAgey9jYWxsfQorey9pZn0KK3svdGVtcGxhdGV9CisKKy8qKgorICogTGluZSBhYm91dCBhIGdpdCBwZXJzb24gaWRlbnRpdHkuCisgKgorICogQHBhcmFtIG5hbWUgbmFtZS4KKyAqIEBwYXJhbSBlbWFpbCBlbWFpbC4KKyAqLwore3RlbXBsYXRlIC5wZXJzb25fIHByaXZhdGU9InRydWUifQoreyRuYW1lfXtpZiAkZW1haWx9ICZsdDt7JGVtYWlsfSZndDt7L2lmfQorey90ZW1wbGF0ZX0KKworLyoqCisgKiBQcmVmb3JtYXR0ZWQgbWVzc2FnZSwgcG9zc2libHkgY29udGFpbmluZyBoeXBlcmxpbmtzLgorICoKKyAqIEBwYXJhbSBjbGFzc05hbWUgQ1NTIGNsYXNzIG5hbWUgZm9yIDxwcmU+IGJsb2NrLgorICogQHBhcmFtIG1lc3NhZ2UgbGlzdCBvZiBtZXNzYWdlIHBhcnRzLCB3aGVyZSBlYWNoIHBhcnQgY29udGFpbnM6CisgKiAgICAgdGV4dDogcmF3IHRleHQgb2YgdGhlIHBhcnQuCisgKiAgICAgdXJsOiBvcHRpb25hbCBVUkwgdGhhdCBzaG91bGQgYmUgbGlua2VkIHRvIGZyb20gdGhlIHBhcnQuCisgKi8KK3t0ZW1wbGF0ZSAubWVzc2FnZV8gcHJpdmF0ZT0idHJ1ZSJ9Cis8cHJlIGNsYXNzPSJ7JGNsYXNzTmFtZXxpZH0iPgorICB7Zm9yZWFjaCAkcGFydCBpbiAkbWVzc2FnZX0KKyAgICB7aWYgJHBhcnQudXJsfTxhIGhyZWY9InskcGFydC51cmx9Ij57JHBhcnQudGV4dH08L2E+e2Vsc2V9eyRwYXJ0LnRleHR9ey9pZn0KKyAgey9mb3JlYWNofQorPC9wcmU+Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1BhdGhEZXRhaWwuc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1BhdGhEZXRhaWwuc295Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDM4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2l0aWxlcy90ZW1wbGF0ZXMvUGF0aERldGFpbC5zb3kKQEAgLTAsMCArMSw4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBEZXRhaWwgcGFnZSBmb3IgYSBwYXRoIHdpdGhpbiBhIHRyZWUuCisgKgorICogQHBhcmFtIHRpdGxlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhpcyBwYXRoLgorICogQHBhcmFtIHJlcG9zaXRvcnlOYW1lIG5hbWUgb2YgdGhpcyByZXBvc2l0b3J5LgorICogQHBhcmFtPyBtZW51RW50cmllcyBtZW51IGVudHJpZXMuCisgKiBAcGFyYW0gYnJlYWRjcnVtYnMgYnJlYWRjcnVtYnMgZm9yIHRoaXMgcGFnZS4KKyAqIEBwYXJhbSB0eXBlIHBhdGggdHlwZSwgbWF0Y2hpbmcgb25lIG9mIHRoZSBjb25zdGFudCBuYW1lcyBkZWZpbmVkIGluCisgKiAgICAgICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlLgorICogQHBhcmFtIGRhdGEgcGF0aCBkYXRhLCBtYXRjaGluZyB0aGUgcGFyYW1zIGZvciBvbmUgb2YgLnRyZWVEZXRhaWwsCisgKiAgICAgLmJsb2JEZXRhaWwsIC5zeW1saW5rRGV0YWlsLCBvciAuZ2l0bGlua0RldGFpbCBhcyBhcHByb3ByaWF0ZS4KKyAqLwore3RlbXBsYXRlIC5wYXRoRGV0YWlsfQore2lmICR0eXBlID09ICdSRUdVTEFSX0ZJTEUnIG9yICR0eXBlID09ICdFWEVDVVRBQkxFX0ZJTEUnfQorICB7Y2FsbCAuaGVhZGVyfQorICAgIHtwYXJhbSB0aXRsZTogJHRpdGxlIC99CisgICAge3BhcmFtIHJlcG9zaXRvcnlOYW1lOiAkcmVwb3NpdG9yeU5hbWUgL30KKyAgICB7cGFyYW0gbWVudUVudHJpZXM6ICRtZW51RW50cmllcyAvfQorICAgIHtwYXJhbSBicmVhZGNydW1iczogJGJyZWFkY3J1bWJzIC99CisgICAge3BhcmFtIGNzczogW2dpdGlsZXMuUFJFVFRJRllfQ1NTX1VSTF0gL30KKyAgICB7cGFyYW0ganM6IFtnaXRpbGVzLlBSRVRUSUZZX0pTX1VSTF0gL30KKyAgICB7cGFyYW0gb25Mb2FkOiAncHJldHR5UHJpbnQoKScgL30KKyAgey9jYWxsfQore2Vsc2V9CisgIHtjYWxsIC5oZWFkZXIgZGF0YT0iYWxsIiAvfQorey9pZn0KKwore3N3aXRjaCAkdHlwZX0KKyAge2Nhc2UgJ1RSRUUnfXtjYWxsIC50cmVlRGV0YWlsIGRhdGE9IiRkYXRhIiAvfQorICB7Y2FzZSAnU1lNTElOSyd9e2NhbGwgLnN5bWxpbmtEZXRhaWwgZGF0YT0iJGRhdGEiIC99CisgIHtjYXNlICdSRUdVTEFSX0ZJTEUnfXtjYWxsIC5ibG9iRGV0YWlsIGRhdGE9IiRkYXRhIiAvfQorICB7Y2FzZSAnRVhFQ1VUQUJMRV9GSUxFJ317Y2FsbCAuYmxvYkRldGFpbCBkYXRhPSIkZGF0YSIgL30KKyAge2Nhc2UgJ0dJVExJTksnfXtjYWxsIC5naXRsaW5rRGV0YWlsIGRhdGE9IiRkYXRhIiAvfQorICB7ZGVmYXVsdH0KKyAgICA8ZGl2IGNsYXNzPSJlcnJvciI+CisgICAgICB7bXNnIGRlc2M9IkVycm9yIG1lc3NhZ2UgZm9yIGFuIHVua25vd24gb2JqZWN0IHR5cGUifU9iamVjdCBoYXMgdW5rbm93biB0eXBlLnsvbXNnfQorICAgIDwvZGl2Pgorey9zd2l0Y2h9CisKK3tjYWxsIC5mb290ZXIgL30KK3svdGVtcGxhdGV9CisKKy8qKgorICogRGV0YWlsIGZvciBhIHN5bWJvbGljIGxpbmsuCisgKgorICogQHBhcmFtIHRhcmdldCB0YXJnZXQgb2YgdGhpcyBzeW1saW5rLgorICogQHBhcmFtPyB0YXJnZXRVcmwgb3B0aW9uYWwgVVJMIGZvciB0aGUgdGFyZ2V0LCBpZiBpdCBpcyB3aXRoaW4gdGhpcyByZXBvLgorICovCit7dGVtcGxhdGUgLnN5bWxpbmtEZXRhaWx9Cis8ZGl2IGNsYXNzPSJzeW1saW5rLWRldGFpbCI+CisgIHttc2cgZGVzYz0iTGVhZC1pbiB0ZXh0IGZvciB0aGUgc3ltYm9saWMgbGluayB0YXJnZXQuIn1TeW1ib2xpYyBsaW5rIHRvey9tc2d9CisgIHtzcH17aWYgJHRhcmdldFVybH08YSBocmVmPSJ7JHRhcmdldFVybH0iPnskdGFyZ2V0fTwvYT57ZWxzZX17JHRhcmdldH17L2lmfQorPC9kaXY+Cit7L3RlbXBsYXRlfQorCisvKioKKyAqIERldGFpbCBmb3IgYSBnaXQgc3VibW9kdWxlIGxpbmsuCisgKgorICogQHBhcmFtIHNoYSBzdWJtb2R1bGUgY29tbWl0IFNIQS4KKyAqIEBwYXJhbSByZW1vdGVVcmwgVVJMIG9mIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4KKyAqIEBwYXJhbT8gaHR0cFVybCBvcHRpb25hbCBIVFRQIFVSTCBwb2ludGluZyB0byBhIHdlYi1icm93c2VyLWNvbXBhdGlibGUgVVJMIG9mCisgKiAgICAgdGhlIHJlbW90ZSByZXBvc2l0b3J5LgorICovCit7dGVtcGxhdGUgLmdpdGxpbmtEZXRhaWx9Cis8ZGl2IGNsYXNzPSJnaXRsaW5rLWRldGFpbCI+CisgIHttc2cgZGVzYz0iTGVhZC1pbiB0ZXh0IGZvciB0aGUgZ2l0IGxpbmsgVVJMIn1TdWJtb2R1bGUgbGluayB0byB7JHNoYX0gb2Z7L21zZ30KKyAge3NwfXtpZiAkaHR0cFVybH08YSBocmVmPSJ7JGh0dHBVcmx9Ij57JHJlbW90ZVVybH08L2E+e2Vsc2V9eyRyZW1vdGVVcmx9ey9pZn0KKzwvZGl2Pgorey90ZW1wbGF0ZX0KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9SZXBvc2l0b3J5SW5kZXguc295IGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1JlcG9zaXRvcnlJbmRleC5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiYjRkYQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9SZXBvc2l0b3J5SW5kZXguc295CkBAIC0wLDAgKzEsNzkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7bmFtZXNwYWNlIGdpdGlsZXMgYXV0b2VzY2FwZT0iY29udGV4dHVhbCJ9CisKKy8qKgorICogSW5kZXggcGFnZSBmb3IgYSByZXBvc2l0b3J5LgorICoKKyAqIEBwYXJhbSByZXBvc2l0b3J5TmFtZSBuYW1lIG9mIHRoaXMgcmVwb3NpdG9yeS4KKyAqIEBwYXJhbT8gbWVudUVudHJpZXMgbWVudSBlbnRyaWVzLgorICogQHBhcmFtIGJyZWFkY3J1bWJzIGJyZWFkY3J1bWJzIGZvciB0aGlzIHBhZ2UuCisgKiBAcGFyYW0gY2xvbmVVcmwgY2xvbmUgVVJMIGZvciB0aGlzIHJlcG9zaXRvcnkuCisgKiBAcGFyYW0gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gdGV4dCBvZiB0aGUgcmVwb3NpdG9yeS4KKyAqIEBwYXJhbT8gYnJhbmNoZXMgbGlzdCBvZiBicmFuY2ggb2JqZWN0cyB3aXRoIHVybCBhbmQgbmFtZSBrZXlzLgorICogQHBhcmFtPyB0YWdzIGxpc3Qgb2YgdGFnIG9iamVjdHMgd2l0aCB1cmwgYW5kIG5hbWUga2V5cy4KKyAqLwore3RlbXBsYXRlIC5yZXBvc2l0b3J5SW5kZXh9Cit7Y2FsbCAuaGVhZGVyfQorICB7cGFyYW0gdGl0bGU6ICRyZXBvc2l0b3J5TmFtZSAvfQorICB7cGFyYW0gcmVwb3NpdG9yeU5hbWU6IG51bGwgL30KKyAge3BhcmFtIG1lbnVFbnRyaWVzOiAkbWVudUVudHJpZXMgL30KKyAge3BhcmFtIGJyZWFkY3J1bWJzOiAkYnJlYWRjcnVtYnMgL30KK3svY2FsbH0KKwore2lmICRkZXNjcmlwdGlvbn0KKyAgPGRpdiBjbGFzcz0icmVwb3NpdG9yeS1kZXNjcmlwdGlvbiI+eyRkZXNjcmlwdGlvbn08L2Rpdj4KK3svaWZ9CisKKzx0ZXh0YXJlYSByb3dzPSIxIiBjb2xzPSIxNTAiIGNsYXNzPSJjbG9uZS1saW5lIgorICBvbmNsaWNrPSJ0aGlzLmZvY3VzKCk7dGhpcy5zZWxlY3QoKTsiCisgIHJlYWRvbmx5PSJyZWFkb25seSI+CisgICAgZ2l0IGNsb25lIHskY2xvbmVVcmx9Cis8L3RleHRhcmVhPgorCis8ZGl2IGNsYXNzPSJyZXBvc2l0b3J5LXJlZnMiPgorICB7aWYgJGJyYW5jaGVzIGFuZCBsZW5ndGgoJGJyYW5jaGVzKX0KKyAgICA8ZGl2IGNsYXNzPSJyZXBvc2l0b3J5LWJyYW5jaGVzIj4KKyAgICAgIDxoMz5CcmFuY2hlczwvaDM+CisgICAgICA8dWwgY2xhc3M9ImJyYW5jaC1saXN0Ij4KKyAgICAgIHtmb3JlYWNoICRicmFuY2ggaW4gJGJyYW5jaGVzfQorICAgICAgICB7Y2FsbCAucmVmXyBkYXRhPSIkYnJhbmNoIiAvfQorICAgICAgey9mb3JlYWNofQorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgey9pZn0KKworICB7aWYgJHRhZ3MgYW5kIGxlbmd0aCgkdGFncyl9CisgICAgPGRpdiBjbGFzcz0icmVwb3NpdG9yeS10YWdzIj4KKyAgICAgIDxoMz5UYWdzPC9oMz4KKyAgICAgIDx1bCBjbGFzcz0iYnJhbmNoLWxpc3QiPgorICAgICAge2ZvcmVhY2ggJHRhZyBpbiAkdGFnc30KKyAgICAgICAge2NhbGwgLnJlZl8gZGF0YT0iJHRhZyIgL30KKyAgICAgIHsvZm9yZWFjaH0KKyAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgIHsvaWZ9Cis8L2Rpdj4KK3tjYWxsIC5mb290ZXIgL30KK3svdGVtcGxhdGV9CisKKy8qKgorICogRGV0YWlsIGZvciBhIHNpbmdsZSByZWYuCisgKgorICogQHBhcmFtIHVybCBVUkwgZm9yIHJlZiBkZXRhaWwgcGFnZS4KKyAqIEBwYXJhbSBuYW1lIHJlZiBuYW1lLgorICovCit7dGVtcGxhdGUgLnJlZl99Cis8bGk+PGEgaHJlZj0ieyR1cmx9Ij57JG5hbWV9PC9hPjwvbGk+Cit7L3RlbXBsYXRlfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dpdGlsZXMvdGVtcGxhdGVzL1JldmlzaW9uRGV0YWlsLnNveSBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9SZXZpc2lvbkRldGFpbC5zb3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiZWQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9naXRpbGVzL3RlbXBsYXRlcy9SZXZpc2lvbkRldGFpbC5zb3kKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3tuYW1lc3BhY2UgZ2l0aWxlcyBhdXRvZXNjYXBlPSJjb250ZXh0dWFsIn0KKworLyoqCisgKiBEZXRhaWwgcGFnZSBhYm91dCBhIHNpbmdsZSByZXZpc2lvbi4KKyAqCisgKiBAcGFyYW0gdGl0bGUgaHVtYW4tcmVhZGFibGUgcmV2aXNpb24gbmFtZS4KKyAqIEBwYXJhbSByZXBvc2l0b3J5TmFtZSBuYW1lIG9mIHRoaXMgcmVwb3NpdG9yeS4KKyAqIEBwYXJhbT8gbWVudUVudHJpZXMgbWVudSBlbnRyaWVzLgorICogQHBhcmFtIGJyZWFkY3J1bWJzIGJyZWFkY3J1bWJzIGZvciB0aGlzIHBhZ2UuCisgKiBAcGFyYW0/IGhhc0Jsb2Igc2V0IHRvIHRydWUgaWYgdGhlIHJldmlzaW9uIG9yIGl0cyBwZWVsZWQgdmFsdWUgaXMgYSBibG9iLgorICogQHBhcmFtIG9iamVjdHMgbGlzdCBvZiBvYmplY3RzIGVuY291bnRlcmVkIHdoZW4gcGVlbGluZyB0aGlzIG9iamVjdC4gRWFjaAorICogICAgIG9iamVjdCBoYXMgYSAidHlwZSIga2V5IHdpdGggb25lIG9mIHRoZQorICogICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnRhbnRzLlRZUEVfKiBjb25zdGFudCBzdHJpbmdzLCBhbmQgYSAiZGF0YSIga2V5CisgKiAgICAgd2l0aCBhbiBvYmplY3Qgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QgZGV0YWlsCisgKiAgICAgdGVtcGxhdGUgZnJvbSBPYmplY3REZXRhaWwuc295LgorICovCit7dGVtcGxhdGUgLnJldmlzaW9uRGV0YWlsfQore2lmICRoYXNCbG9ifQorICB7Y2FsbCAuaGVhZGVyfQorICAgIHtwYXJhbSB0aXRsZTogJHRpdGxlIC99CisgICAge3BhcmFtIHJlcG9zaXRvcnlOYW1lOiAkcmVwb3NpdG9yeU5hbWUgL30KKyAgICB7cGFyYW0gbWVudUVudHJpZXM6ICRtZW51RW50cmllcyAvfQorICAgIHtwYXJhbSBicmVhZGNydW1iczogJGJyZWFkY3J1bWJzIC99CisgICAge3BhcmFtIGNzczogW2dpdGlsZXMuUFJFVFRJRllfQ1NTX1VSTF0gL30KKyAgICB7cGFyYW0ganM6IFtnaXRpbGVzLlBSRVRUSUZZX0pTX1VSTF0gL30KKyAgICB7cGFyYW0gb25Mb2FkOiAncHJldHR5UHJpbnQoKScgL30KKyAgey9jYWxsfQore2Vsc2V9CisgIHtjYWxsIC5oZWFkZXIgZGF0YT0iYWxsIiAvfQorey9pZn0KKwore2ZvcmVhY2ggJG9iamVjdCBpbiAkb2JqZWN0c30KKyAge3N3aXRjaCAkb2JqZWN0LnR5cGV9CisgICAge2Nhc2UgJ2NvbW1pdCd9CisgICAgICB7Y2FsbCAuY29tbWl0RGV0YWlsIGRhdGE9IiRvYmplY3QuZGF0YSIgL30KKyAgICB7Y2FzZSAndHJlZSd9CisgICAgICB7Y2FsbCAudHJlZURldGFpbCBkYXRhPSIkb2JqZWN0LmRhdGEiIC99CisgICAge2Nhc2UgJ2Jsb2InfQorICAgICAge2NhbGwgLmJsb2JEZXRhaWwgZGF0YT0iJG9iamVjdC5kYXRhIiAvfQorICAgIHtjYXNlICd0YWcnfQorICAgICAge2NhbGwgLnRhZ0RldGFpbCBkYXRhPSIkb2JqZWN0LmRhdGEiIC99CisgICAge2RlZmF1bHR9CisgICAgICA8ZGl2IGNsYXNzPSJlcnJvciI+CisgICAgICAgIHttc2cgZGVzYz0iRXJyb3IgbWVzc2FnZSBmb3IgYW4gdW5rbm93biBvYmplY3QgdHlwZSJ9T2JqZWN0IGhhcyB1bmtub3duIHR5cGUuey9tc2d9CisgICAgICA8L2Rpdj4KKyAgey9zd2l0Y2h9Cit7L2ZvcmVhY2h9CisKK3tjYWxsIC5mb290ZXIgL30KK3svdGVtcGxhdGV9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29uZmlnVXRpbFRlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9Db25maWdVdGlsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDM5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvQ29uZmlnVXRpbFRlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuQ29uZmlnVXRpbC5nZXREdXJhdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuam9kYS50aW1lLkR1cmF0aW9uOworCisvKiogVGVzdHMgZm9yIGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzLiAqLworcHVibGljIGNsYXNzIENvbmZpZ1V0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0R2V0RHVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBEdXJhdGlvbiBkZWYgPSBEdXJhdGlvbi5zdGFuZGFyZFNlY29uZHMoMik7CisgICAgQ29uZmlnIGNvbmZpZyA9IG5ldyBDb25maWcoKTsKKyAgICBEdXJhdGlvbiB0OworCisgICAgY29uZmlnLnNldFN0cmluZygiY29yZSIsICJkaHQiLCAidGltZW91dCIsICI1MDAgbXMiKTsKKyAgICB0ID0gZ2V0RHVyYXRpb24oY29uZmlnLCAiY29yZSIsICJkaHQiLCAidGltZW91dCIsIGRlZik7CisgICAgYXNzZXJ0RXF1YWxzKDUwMCwgdC5nZXRNaWxsaXMoKSk7CisKKyAgICBjb25maWcuc2V0U3RyaW5nKCJjb3JlIiwgImRodCIsICJ0aW1lb3V0IiwgIjUuMiBzZWMiKTsKKyAgICB0ID0gZ2V0RHVyYXRpb24oY29uZmlnLCAiY29yZSIsICJkaHQiLCAidGltZW91dCIsIGRlZik7CisgICAgYXNzZXJ0RXF1YWxzKDUyMDAsIHQuZ2V0TWlsbGlzKCkpOworCisgICAgY29uZmlnLnNldFN0cmluZygiY29yZSIsICJkaHQiLCAidGltZW91dCIsICIxIG1pbiIpOworICAgIHQgPSBnZXREdXJhdGlvbihjb25maWcsICJjb3JlIiwgImRodCIsICJ0aW1lb3V0IiwgZGVmKTsKKyAgICBhc3NlcnRFcXVhbHMoNjAwMDAsIHQuZ2V0TWlsbGlzKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zha2VIdHRwU2VydmxldFJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWFmYTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zha2VIdHRwU2VydmxldFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDM4OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5UZXN0R2l0aWxlc1VybHMuVVJMUzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworLyoqIFNpbXBsZSBmYWtlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9LiAqLworcHVibGljIGNsYXNzIEZha2VIdHRwU2VydmxldFJlcXVlc3QgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlcXVlc3QgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX1BBVEggPSAiL2IiOworCisgIHB1YmxpYyBzdGF0aWMgRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdCBuZXdSZXF1ZXN0KCkgeworICAgIHJldHVybiBuZXcgRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdCgKKyAgICAgICAgVVJMUy5nZXRIb3N0TmFtZShudWxsKSwKKyAgICAgICAgODAsCisgICAgICAgICIiLAorICAgICAgICBTRVJWTEVUX1BBVEgsCisgICAgICAgICIiKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdCBuZXdSZXF1ZXN0KERmc1JlcG9zaXRvcnkgcmVwbykgeworICAgIEZha2VIdHRwU2VydmxldFJlcXVlc3QgcmVxID0gbmV3UmVxdWVzdCgpOworICAgIHJlcS5zZXRBdHRyaWJ1dGUoU2VydmxldFV0aWxzLkFUVFJJQlVURV9SRVBPU0lUT1JZLCByZXBvKTsKKyAgICByZXR1cm4gcmVxOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZXM7CisgIHByaXZhdGUgZmluYWwgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzOworCisgIHByaXZhdGUgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzOworICBwcml2YXRlIFN0cmluZyBob3N0TmFtZTsKKyAgcHJpdmF0ZSBpbnQgcG9ydDsKKyAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFBhdGg7CisgIHByaXZhdGUgU3RyaW5nIHNlcnZsZXRQYXRoOworICBwcml2YXRlIFN0cmluZyBwYXRoOworCisgIHByaXZhdGUgRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdChTdHJpbmcgaG9zdE5hbWUsIGludCBwb3J0LCBTdHJpbmcgY29udGV4dFBhdGgsIFN0cmluZyBzZXJ2bGV0UGF0aCwKKyAgICAgIFN0cmluZyBwYXRoKSB7CisgICAgdGhpcy5ob3N0TmFtZSA9IGNoZWNrTm90TnVsbChob3N0TmFtZSwgImhvc3ROYW1lIik7CisgICAgY2hlY2tBcmd1bWVudChwb3J0ID4gMCk7CisgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB0aGlzLmNvbnRleHRQYXRoID0gY2hlY2tOb3ROdWxsKGNvbnRleHRQYXRoLCAiY29udGV4dFBhdGgiKTsKKyAgICB0aGlzLnNlcnZsZXRQYXRoID0gY2hlY2tOb3ROdWxsKHNlcnZsZXRQYXRoLCAic2VydmxldFBhdGgiKTsKKyAgICBhdHRyaWJ1dGVzID0gTWFwcy5uZXdDb25jdXJyZW50TWFwKCk7CisgICAgcGFyYW1ldGVycyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICBoZWFkZXJzID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihhdHRyaWJ1dGVzLmtleVNldCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgIHJldHVybiBVVEZfOC5uYW1lKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRMb2NhbEFkZHIoKSB7CisgICAgcmV0dXJuICIxLjIuMy40IjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKKyAgICByZXR1cm4gaG9zdE5hbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRMb2NhbFBvcnQoKSB7CisgICAgcmV0dXJuIHBvcnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisgICAgcmV0dXJuIExvY2FsZS5VUzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRW51bWVyYXRpb248TG9jYWxlPiBnZXRMb2NhbGVzKCkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihDb2xsZWN0aW9ucy5zaW5nbGV0b24oTG9jYWxlLlVTKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gSXRlcmFibGVzLmdldEZpcnN0KHBhcmFtZXRlcnMuZ2V0KG5hbWUpLCBudWxsKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPENvbGxlY3Rpb248U3RyaW5nPiwgU3RyaW5nW10+IFNUUklOR19DT0xMRUNUSU9OX1RPX0FSUkFZID0KKyAgICAgIG5ldyBGdW5jdGlvbjxDb2xsZWN0aW9uPFN0cmluZz4sIFN0cmluZ1tdPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBhcHBseShDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworICAgICAgICB9CisgICAgICB9OworCisgIEBPdmVycmlkZQorICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nW10+IGdldFBhcmFtZXRlck1hcCgpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKAorICAgICAgICBNYXBzLnRyYW5zZm9ybVZhbHVlcyhwYXJhbWV0ZXJzLmFzTWFwKCksIFNUUklOR19DT0xMRUNUSU9OX1RPX0FSUkFZKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHBhcmFtZXRlcnMua2V5U2V0KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gU1RSSU5HX0NPTExFQ1RJT05fVE9fQVJSQVkuYXBwbHkocGFyYW1ldGVycy5nZXQobmFtZSkpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHFzKSB7CisgICAgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgZm9yIChTdHJpbmcgZW50cnkgOiBTcGxpdHRlci5vbignJicpLnNwbGl0KHFzKSkgeworICAgICAgTGlzdDxTdHJpbmc+IGt2ID0gSW1tdXRhYmxlTGlzdC5jb3B5T2YoU3BsaXR0ZXIub24oJz0nKS5saW1pdCgyKS5zcGxpdChlbnRyeSkpOworICAgICAgdHJ5IHsKKyAgICAgICAgcGFyYW1zLnB1dChVUkxEZWNvZGVyLmRlY29kZShrdi5nZXQoMCksIFVURl84Lm5hbWUoKSksCisgICAgICAgICAgICBrdi5zaXplKCkgPT0gMiA/IFVSTERlY29kZXIuZGVjb2RlKGt2LmdldCgxKSwgVVRGXzgubmFtZSgpKSA6ICIiKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKyAgICBwYXJhbWV0ZXJzID0gcGFyYW1zOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgcmV0dXJuICJIVFRQLzEuMSI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBARGVwcmVjYXRlZAorICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgeworICAgIHJldHVybiAiNS42LjcuOCI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgeworICAgIHJldHVybiAicmVtb3RlaG9zdCI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgeworICAgIHJldHVybiAxMjM0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXRSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgcGF0aCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgeworICAgIHJldHVybiBwb3J0ID09IDQ0MyA/ICJodHRwcyIgOiAiaHR0cCI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkgeworICAgIHJldHVybiBob3N0TmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKSB7CisgICAgcmV0dXJuIHBvcnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgcmV0dXJuIHBvcnQgPT0gNDQzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgIGF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBlbnYpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgIHJldHVybiBjb250ZXh0UGF0aDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ29va2llW10gZ2V0Q29va2llcygpIHsKKyAgICByZXR1cm4gbmV3IENvb2tpZVswXTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gSXRlcmFibGVzLmdldEZpcnN0KGhlYWRlcnMuZ2V0KG5hbWUpLCBudWxsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRIZWFkZXJOYW1lcygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oaGVhZGVycy5rZXlTZXQoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0SGVhZGVycyhTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihoZWFkZXJzLmdldChuYW1lKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChnZXRIZWFkZXIobmFtZSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworICAgIHJldHVybiAiR0VUIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworICAgIHJldHVybiBwYXRoOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0UGF0aEluZm8oU3RyaW5nIHBhdGgpIHsKKyAgICB0aGlzLnBhdGggPSBjaGVja05vdE51bGwocGF0aCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQYXRoVHJhbnNsYXRlZCgpIHsKKyAgICByZXR1cm4gcGF0aDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlVXNlcigpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZXF1ZXN0VVJMKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7CisgICAgcmV0dXJuIHNlcnZsZXRQYXRoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9GYWtlSHR0cFNlcnZsZXRSZXNwb25zZS5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0Zha2VIdHRwU2VydmxldFJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhMDA5OQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9GYWtlSHR0cFNlcnZsZXRSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzLlVURl84OworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBTaW1wbGUgZmFrZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0uICovCitwdWJsaWMgY2xhc3MgRmFrZUh0dHBTZXJ2bGV0UmVzcG9uc2UgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlc3BvbnNlIHsKKworICBwcml2YXRlIHZvbGF0aWxlIGludCBzdGF0dXM7CisKKyAgcHVibGljIEZha2VIdHRwU2VydmxldFJlc3BvbnNlKCkgeworICAgIHN0YXR1cyA9IDIwMDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmbHVzaEJ1ZmZlcigpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICByZXR1cm4gVVRGXzgubmFtZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisgICAgcmV0dXJuIExvY2FsZS5VUzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1pdHRlZCgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgc3opIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgbmFtZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbmd0aCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVSTChTdHJpbmcgdXJsKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgdXJsKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBlbmNvZGVVUkwoU3RyaW5nIHVybCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyB1cmwpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjKSB7CisgICAgc3RhdHVzID0gc2M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYywgU3RyaW5nIG1zZykgeworICAgIHN0YXR1cyA9IHNjOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgbXNnKSB7CisgICAgc3RhdHVzID0gU0NfRk9VTkQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0SW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjKSB7CisgICAgc3RhdHVzID0gc2M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYywgU3RyaW5nIG1zZykgeworICAgIHN0YXR1cyA9IHNjOworICB9CisKKyAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNGaWx0ZXJUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDMyZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzRmlsdGVyLlJFUE9fUEFUSF9SRUdFWDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNGaWx0ZXIuUkVQT19SRUdFWDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNGaWx0ZXIuUk9PVF9SRUdFWDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworCisvKiogVGVzdHMgZm9yIHRoZSBHaXRpbGVzIGZpbHRlci4gKi8KK3B1YmxpYyBjbGFzcyBHaXRpbGVzRmlsdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdFJvb3RVcmxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiL2ZvbyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIvZm9vLyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIvZm9vLyAiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiL2Zvby8rIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIi9mb28vKyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUk9PVF9SRUdFWC5tYXRjaGVyKCIvZm9vLyAvIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShST09UX1JFR0VYLm1hdGNoZXIoIi9mb28vKy8iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJPT1RfUkVHRVgubWF0Y2hlcigiL2Zvby8rL2JhciIpLm1hdGNoZXMoKSk7CisgICAgTWF0Y2hlciBtOworCisgICAgbSA9IFJPT1RfUkVHRVgubWF0Y2hlcigiLyIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiLyIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi8iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUk9PVF9SRUdFWC5tYXRjaGVyKCIvLyIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiLy8iLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoNCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcG9VcmxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19SRUdFWC5tYXRjaGVyKCIiKS5tYXRjaGVzKCkpOworCisgICAgLy8gVGhlc2UgbWF0Y2ggdGhlIHJlZ2V4IGJ1dCBhcmUgc2VydmVkIGJ5IHRoZSByb290IHJlZ2V4IGJpbmRlciwgd2hpY2ggaXMKKyAgICAvLyBtYXRjaGVkIGZpcnN0LgorICAgIGFzc2VydFRydWUoUkVQT19SRUdFWC5tYXRjaGVyKCIvIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRUcnVlKFJFUE9fUkVHRVgubWF0Y2hlcigiLy8iKS5tYXRjaGVzKCkpOworCisgICAgYXNzZXJ0RmFsc2UoUkVQT19SRUdFWC5tYXRjaGVyKCIvZm9vLysiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUkVHRVgubWF0Y2hlcigiL2Zvby9iYXIvKyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19SRUdFWC5tYXRjaGVyKCIvZm9vL2Jhci8rLyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19SRUdFWC5tYXRjaGVyKCIvZm9vL2Jhci8rL2JheiIpLm1hdGNoZXMoKSk7CisgICAgTWF0Y2hlciBtOworCisgICAgbSA9IFJFUE9fUkVHRVgubWF0Y2hlcigiL2ZvbyIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19SRUdFWC5tYXRjaGVyKCIvZm9vLyIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby8iLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoNCkpOworCisgICAgbSA9IFJFUE9fUkVHRVgubWF0Y2hlcigiL2Zvby9iYXIiKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vYmFyIiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby9iYXIiLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCg0KSk7CisKKyAgICBtID0gUkVQT19SRUdFWC5tYXRjaGVyKCIvZm9vL2JhcitiYXoiKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vYmFyK2JheiIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vYmFyK2JheiIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDQpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBvUGF0aFVybHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiLyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi8vIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2ZvbyIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vICIpLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RmFsc2UoUkVQT19QQVRIX1JFR0VYLm1hdGNoZXIoIi9mb28vIC8iKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vLyAvYmFyIikubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRGYWxzZShSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby9iYXIiKS5tYXRjaGVzKCkpOworICAgIGFzc2VydEZhbHNlKFJFUE9fUEFUSF9SRUdFWC5tYXRjaGVyKCIvZm9vL2JhcitiYXoiKS5tYXRjaGVzKCkpOworICAgIE1hdGNoZXIgbTsKKworICAgIG0gPSBSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8rIik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vLysiLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIrIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8rLyIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby8rLyIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIisiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi8iLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8rL2Jhci9iYXoiKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vKy9iYXIvYmF6IiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiKyIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiL2Jhci9iYXoiLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8rL2Jhci9iYXovIik7CisgICAgYXNzZXJ0VHJ1ZShtLm1hdGNoZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vLysvYmFyL2Jhei8iLCBtLmdyb3VwKDApKTsKKyAgICBhc3NlcnRFcXVhbHMobS5ncm91cCgwKSwgbS5ncm91cCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvZm9vIiwgbS5ncm91cCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIrIiwgbS5ncm91cCgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIvYmFyL2Jhei8iLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8rL2JhciBiYXoiKTsKKyAgICBhc3NlcnRUcnVlKG0ubWF0Y2hlcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28vKy9iYXIgYmF6IiwgbS5ncm91cCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKG0uZ3JvdXAoMCksIG0uZ3JvdXAoMSkpOworICAgIGFzc2VydEVxdWFscygiL2ZvbyIsIG0uZ3JvdXAoMikpOworICAgIGFzc2VydEVxdWFscygiKyIsIG0uZ3JvdXAoMykpOworICAgIGFzc2VydEVxdWFscygiL2JhciBiYXoiLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8rL2Jhci8rL2JheiIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby8rL2Jhci8rL2JheiIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIisiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9iYXIvKy9iYXoiLCBtLmdyb3VwKDQpKTsKKworICAgIG0gPSBSRVBPX1BBVEhfUkVHRVgubWF0Y2hlcigiL2Zvby8rYmFyL2JheiIpOworICAgIGFzc2VydFRydWUobS5tYXRjaGVzKCkpOworICAgIGFzc2VydEVxdWFscygiL2Zvby8rYmFyL2JheiIsIG0uZ3JvdXAoMCkpOworICAgIGFzc2VydEVxdWFscyhtLmdyb3VwKDApLCBtLmdyb3VwKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9mb28iLCBtLmdyb3VwKDIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIitiYXIiLCBtLmdyb3VwKDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi9iYXoiLCBtLmdyb3VwKDQpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNVcmxzVGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNVcmxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMmZmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1VybHNUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdpdGlsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNVcmxzLk5BTUVfRVNDQVBFUjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBHaXRpbGVzVXJsc30uICovCitwdWJsaWMgY2xhc3MgR2l0aWxlc1VybHNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUVzY2FwZXJFc2NhcGVzQXBwcm9wcmlhdGVTcGVjaWFsQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscygiZm9vX2JhciIsIE5BTUVfRVNDQVBFUi5hcHBseSgiZm9vX2JhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby1iYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvby1iYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lMjViYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbyViYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lMjZiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbyZiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lMjhiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbyhiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lMjliYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbyliYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lM0FiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbzpiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lM0JiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbztiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lM0RiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbz1iYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lM0ZiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbz9iYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lNUJiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvb1tiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lNURiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvb11iYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lN0JiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvb3tiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28lN0RiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvb31iYXIiKSk7CisgIH0KKyAgcHVibGljIHZvaWQgdGVzdE5hbWVFc2NhcGVyRG9lc05vdEVzY2FwZVNsYXNoZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvby9iYXIiKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUVzY2FwZXJFc2NhcGVzU3BhY2VzV2l0aFBlcmNlbnRJbnN0ZWFkT2ZQbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28rYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28rYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTIwYmFyIiwgTkFNRV9FU0NBUEVSLmFwcGx5KCJmb28gYmFyIikpOworICAgIGFzc2VydEVxdWFscygiZm9vJTI1MjBiYXIiLCBOQU1FX0VTQ0FQRVIuYXBwbHkoImZvbyUyMGJhciIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNWaWV3VGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL0dpdGlsZXNWaWV3VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTVjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvR2l0aWxlc1ZpZXdUZXN0LmphdmEKQEAgLTAsMCArMSw1MDQgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzVmlldy5UeXBlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CisKKy8qKiBUZXN0cyBmb3IgR2l0aWxlcyB2aWV3cy4gKi8KK3B1YmxpYyBjbGFzcyBHaXRpbGVzVmlld1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEdpdGlsZXNWaWV3IEhPU1QgPSBHaXRpbGVzVmlldy5ob3N0SW5kZXgoKQorICAgICAgLnNldFNlcnZsZXRQYXRoKCIvYiIpCisgICAgICAuc2V0SG9zdE5hbWUoImhvc3QiKQorICAgICAgLmJ1aWxkKCk7CisKKyAgcHVibGljIHZvaWQgdGVzdEVtcHR5U2VydmxldFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcuaG9zdEluZGV4KCkKKyAgICAgICAgLnNldFNlcnZsZXRQYXRoKCIiKQorICAgICAgICAuc2V0SG9zdE5hbWUoImhvc3QiKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuSE9TVF9JTkRFWCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldFJldmlzaW9uKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi8/Zm9ybWF0PUhUTUwiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJob3N0IiwgInVybCIsICIvP2Zvcm1hdD1IVE1MIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEhvc3RJbmRleCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscygiL2IiLCBIT1NULmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkhPU1RfSU5ERVgsIEhPU1QuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCBIT1NULmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydE51bGwoSE9TVC5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgSE9TVC5nZXRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnROdWxsKEhPU1QuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi8/Zm9ybWF0PUhUTUwiLCBIT1NULnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJob3N0IiwgInVybCIsICIvYi8/Zm9ybWF0PUhUTUwiKSksCisgICAgICAgIEhPU1QuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcuaG9zdEluZGV4KCkuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnB1dFBhcmFtKCJmb28iLCAiZm9vdmFsdWUiKQorICAgICAgICAucHV0UGFyYW0oImJhciIsICJiYXJ2YWx1ZSIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuSE9TVF9JTkRFWCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldFJldmlzaW9uKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3RNdWx0aW1hcC5vZigKKyAgICAgICAgICAgICJmb28iLCAiZm9vdmFsdWUiLAorICAgICAgICAgICAgImJhciIsICJiYXJ2YWx1ZSIpLAorICAgICAgICB2aWV3LmdldFBhcmFtZXRlcnMoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iLz9mb3JtYXQ9SFRNTCZmb289Zm9vdmFsdWUmYmFyPWJhcnZhbHVlIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZihJbW11dGFibGVNYXAub2YoInRleHQiLCAiaG9zdCIsICJ1cmwiLCAiL2IvP2Zvcm1hdD1IVE1MIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1zTm90Q29waWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3Lmhvc3RJbmRleCgpLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5wdXRQYXJhbSgiZm9vIiwgImZvb3ZhbHVlIikKKyAgICAgICAgLnB1dFBhcmFtKCJiYXIiLCAiYmFydmFsdWUiKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBHaXRpbGVzVmlldyBjb3B5ID0gR2l0aWxlc1ZpZXcuaG9zdEluZGV4KCkuY29weUZyb20odmlldykuYnVpbGQoKTsKKyAgICBhc3NlcnRGYWxzZSh2aWV3LmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworICAgIGFzc2VydFRydWUoY29weS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5SW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcucmVwb3NpdG9yeUluZGV4KCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVQT1NJVE9SWV9JTkRFWCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLyIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVmV2l0aFJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LnJldmlzaW9uKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rc2hvdy9tYXN0ZXIiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXIiLCAiL2IvZm9vL2Jhci8rc2hvdy9tYXN0ZXIiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Tm9QYXRoQ29tcG9uZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5wYXRoKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIi8iKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLysvbWFzdGVyLyIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3RlciIsICIvYi9mb28vYmFyLytzaG93L21hc3RlciIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiLiIsICIvYi9mb28vYmFyLysvbWFzdGVyLyIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPbmVQYXRoQ29tcG9uZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LnBhdGgoKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiL2ZpbGUiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZpbGUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rL21hc3Rlci9maWxlIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyIiwgIi9iL2Zvby9iYXIvK3Nob3cvbWFzdGVyIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCIuIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmaWxlIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIvZmlsZSIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVBhdGhDb21wb25lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LnBhdGgoKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXIiLCBpZCkpCisgICAgICAgIC5zZXRUcmVlUGF0aCgiL3BhdGgvdG8vYS9maWxlIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL2EvZmlsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLysvbWFzdGVyL3BhdGgvdG8vYS9maWxlIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyIiwgIi9iL2Zvby9iYXIvK3Nob3cvbWFzdGVyIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCIuIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJwYXRoIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIvcGF0aCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigidG8iLCAiL2IvZm9vL2Jhci8rL21hc3Rlci9wYXRoL3RvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJhIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIvcGF0aC90by9hIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmaWxlIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIvcGF0aC90by9hL2ZpbGUiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RGlmZkFnYWluc3RGaXJzdFBhcmVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIE9iamVjdElkIHBhcmVudCA9IE9iamVjdElkLmZyb21TdHJpbmcoImVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzgiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcuZGlmZigpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLnNldE9sZFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50KSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCIvcGF0aC90by9hL2ZpbGUiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vYS9maWxlIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aC90by9hL2ZpbGUiLCB2aWV3LnRvVXJsKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImhvc3QiLCAiL2IvP2Zvcm1hdD1IVE1MIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmb28vYmFyIiwgIi9iL2Zvby9iYXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJtYXN0ZXJeISIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiLiIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigicGF0aCIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInRvIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aC90byIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiYSIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgvdG8vYSIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZmlsZSIsICIvYi9mb28vYmFyLysvbWFzdGVyJTVFJTIxL3BhdGgvdG8vYS9maWxlIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERpZmZBZ2FpbnN0RW1wdHlSZXZpc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5kaWZmKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIi9wYXRoL3RvL2EvZmlsZSIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydEVxdWFscygicGF0aC90by9hL2ZpbGUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoL3RvL2EvZmlsZSIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIm1hc3Rlcl4hIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCIuIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJwYXRoIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigidG8iLCAiL2IvZm9vL2Jhci8rL21hc3RlciU1RSUyMS9wYXRoL3RvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJhIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aC90by9hIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmaWxlIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIlNUUlMjEvcGF0aC90by9hL2ZpbGUiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RGlmZkFnYWluc3RPdGhlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIE9iamVjdElkIG90aGVyID0gT2JqZWN0SWQuZnJvbVN0cmluZygiZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5kaWZmKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuc2V0T2xkUmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoImVmYWI1Njc4Iiwgb3RoZXIpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIi9wYXRoL3RvL2EvZmlsZSIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZWZhYjU2NzgiLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vYS9maWxlIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvKy9lZmFiNTY3OC4ubWFzdGVyL3BhdGgvdG8vYS9maWxlIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZWZhYjU2NzguLm1hc3RlciIsICIvYi9mb28vYmFyLysvZWZhYjU2NzguLm1hc3Rlci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIi4iLCAiL2IvZm9vL2Jhci8rL2VmYWI1Njc4Li5tYXN0ZXIvIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJwYXRoIiwgIi9iL2Zvby9iYXIvKy9lZmFiNTY3OC4ubWFzdGVyL3BhdGgiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInRvIiwgIi9iL2Zvby9iYXIvKy9lZmFiNTY3OC4ubWFzdGVyL3BhdGgvdG8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImEiLCAiL2IvZm9vL2Jhci8rL2VmYWI1Njc4Li5tYXN0ZXIvcGF0aC90by9hIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJmaWxlIiwgIi9iL2Zvby9iYXIvKy9lZmFiNTY3OC4ubWFzdGVyL3BhdGgvdG8vYS9maWxlIikpLAorICAgICAgICB2aWV3LmdldEJyZWFkY3J1bWJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJyYW5jaExvZ1dpdGhvdXRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LmxvZygpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLysvbWFzdGVyIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SWRMb2dXaXRob3V0UGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5sb2coKQorICAgICAgICAuY29weUZyb20oSE9TVCkKKyAgICAgICAgLnNldFJlcG9zaXRvcnlOYW1lKCJmb28vYmFyIikKKyAgICAgICAgLnNldFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJhYmNkMTIzNCIsIGlkKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iIiwgdmlldy5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhvc3QiLCB2aWV3LmdldEhvc3ROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGlkLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJhYmNkMTIzNCIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgICBhc3NlcnRUcnVlKEhPU1QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIi9iL2Zvby9iYXIvK2xvZy9hYmNkMTIzNCIsIHZpZXcudG9VcmwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvby9iYXIiLCAiL2IvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImFiY2QxMjM0IiwgIi9iL2Zvby9iYXIvK2xvZy9hYmNkMTIzNCIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMb2dXaXRob3V0T2xkUmV2aXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBHaXRpbGVzVmlldyB2aWV3ID0gR2l0aWxlc1ZpZXcubG9nKCkKKyAgICAgICAgLmNvcHlGcm9tKEhPU1QpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgiZm9vL2JhciIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibWFzdGVyIiwgaWQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIi9wYXRoL3RvL2EvZmlsZSIpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL2EvZmlsZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0VHJ1ZShIT1NULmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCIvYi9mb28vYmFyLytsb2cvbWFzdGVyL3BhdGgvdG8vYS9maWxlIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyIiwgIi9iL2Zvby9iYXIvKy9tYXN0ZXIiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoInBhdGgiLCAiL2IvZm9vL2Jhci8rbG9nL21hc3Rlci9wYXRoIiksCisgICAgICAgICAgICBicmVhZGNydW1iKCJ0byIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyL3BhdGgvdG8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImEiLCAiL2IvZm9vL2Jhci8rbG9nL21hc3Rlci9wYXRoL3RvL2EiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZpbGUiLCAiL2IvZm9vL2Jhci8rbG9nL21hc3Rlci9wYXRoL3RvL2EvZmlsZSIpKSwKKyAgICAgICAgdmlldy5nZXRCcmVhZGNydW1icygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMb2dXaXRoT2xkUmV2aXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBPYmplY3RJZCBwYXJlbnQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4Iik7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LmxvZygpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvby9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoIm1hc3RlciIsIGlkKSkKKyAgICAgICAgLnNldE9sZFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJtYXN0ZXJeIiwgcGFyZW50KSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCIvcGF0aC90by9hL2ZpbGUiKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygiL2IiLCB2aWV3LmdldFNlcnZsZXRQYXRoKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaG9zdCIsIHZpZXcuZ2V0SG9zdE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgdmlldy5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaWQsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygicGF0aC90by9hL2ZpbGUiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICAgIGFzc2VydFRydWUoSE9TVC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygiL2IvZm9vL2Jhci8rbG9nL21hc3RlciU1RS4ubWFzdGVyL3BhdGgvdG8vYS9maWxlIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBicmVhZGNydW1iKCJob3N0IiwgIi9iLz9mb3JtYXQ9SFRNTCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZm9vL2JhciIsICIvYi9mb28vYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibWFzdGVyXi4ubWFzdGVyIiwgIi9iL2Zvby9iYXIvK2xvZy9tYXN0ZXIlNUUuLm1hc3RlciIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigicGF0aCIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyJTVFLi5tYXN0ZXIvcGF0aCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigidG8iLCAiL2IvZm9vL2Jhci8rbG9nL21hc3RlciU1RS4ubWFzdGVyL3BhdGgvdG8iKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImEiLCAiL2IvZm9vL2Jhci8rbG9nL21hc3RlciU1RS4ubWFzdGVyL3BhdGgvdG8vYSIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigiZmlsZSIsICIvYi9mb28vYmFyLytsb2cvbWFzdGVyJTVFLi5tYXN0ZXIvcGF0aC90by9hL2ZpbGUiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcoImFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzQiKTsKKyAgICBPYmplY3RJZCBwYXJlbnQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKCJlZmFiNTY3OGVmYWI1Njc4ZWZhYjU2NzhlZmFiNTY3OGVmYWI1Njc4Iik7CisgICAgLy8gU29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlIG5vdCB2YWxpZCBmb3IgR2l0LCBidXQgY2hlY2sgdGhlbSBhbnl3YXkuCisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IEdpdGlsZXNWaWV3LmxvZygpCisgICAgICAgIC5jb3B5RnJvbShIT1NUKQorICAgICAgICAuc2V0UmVwb3NpdG9yeU5hbWUoImZvbz9iYXIiKQorICAgICAgICAuc2V0UmV2aXNpb24oUmV2aXNpb24udW5wZWVsZWQoImJhL2QjbmFtZSIsIGlkKSkKKyAgICAgICAgLnNldE9sZFJldmlzaW9uKFJldmlzaW9uLnVucGVlbGVkKCJvdGhlclwibmEvbWUiLCBwYXJlbnQpKQorICAgICAgICAuc2V0VHJlZVBhdGgoIndlIGlyZC9wYSd0aC9uYW1lIikKKyAgICAgICAgLnB1dFBhcmFtKCJrIGUgeSIsICJ2YWwvdWUiKQorICAgICAgICAuc2V0QW5jaG9yKCJhbmMjaG9yIikKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAvLyBGaWVsZHMgcmV0dXJuZWQgYnkgZ2V0dGVycyBhcmUgbm90IGVzY2FwZWQuCisgICAgYXNzZXJ0RXF1YWxzKCIvYiIsIHZpZXcuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbz9iYXIiLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhpZCwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiYmEvZCNuYW1lIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygib3RoZXJcIm5hL21lIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ3ZSBpcmQvcGEndGgvbmFtZSIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3RNdWx0aW1hcC48U3RyaW5nLCBTdHJpbmc+IG9mKCJrIGUgeSIsICJ2YWwvdWUiKSwKKyAgICAgICAgdmlldy5nZXRQYXJhbWV0ZXJzKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAiL2IvZm9vJTNGYmFyLytsb2cvb3RoZXIlMjJuYS9tZS4uYmEvZCUyM25hbWUvd2UlMjBpcmQvcGElMjd0aC9uYW1lIgorICAgICAgICArICI/aytlK3k9dmFsJTJGdWUjYW5jJTIzaG9yIiwgdmlldy50b1VybCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICAvLyBOYW1lcyBhcmUgbm90IGVzY2FwZWQgKGF1dG8tZXNjYXBlZCBieSBTb3kpIGJ1dCB2YWx1ZXMgYXJlLgorICAgICAgICAgICAgYnJlYWRjcnVtYigiaG9zdCIsICIvYi8/Zm9ybWF0PUhUTUwiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoImZvbz9iYXIiLCAiL2IvZm9vJTNGYmFyLyIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigib3RoZXJcIm5hL21lLi5iYS9kI25hbWUiLCAiL2IvZm9vJTNGYmFyLytsb2cvb3RoZXIlMjJuYS9tZS4uYmEvZCUyM25hbWUiKSwKKyAgICAgICAgICAgIGJyZWFkY3J1bWIoIndlIGlyZCIsICIvYi9mb28lM0ZiYXIvK2xvZy9vdGhlciUyMm5hL21lLi5iYS9kJTIzbmFtZS93ZSUyMGlyZCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigicGEndGgiLCAiL2IvZm9vJTNGYmFyLytsb2cvb3RoZXIlMjJuYS9tZS4uYmEvZCUyM25hbWUvd2UlMjBpcmQvcGElMjd0aCIpLAorICAgICAgICAgICAgYnJlYWRjcnVtYigibmFtZSIsCisgICAgICAgICAgICAgICIvYi9mb28lM0ZiYXIvK2xvZy9vdGhlciUyMm5hL21lLi5iYS9kJTIzbmFtZS93ZSUyMGlyZC9wYSUyN3RoL25hbWUiKSksCisgICAgICAgIHZpZXcuZ2V0QnJlYWRjcnVtYnMoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IGJyZWFkY3J1bWIoU3RyaW5nIHRleHQsIFN0cmluZyB1cmwpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgdGV4dCwgInVybCIsIHVybCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9MaW5raWZpZXJUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTGlua2lmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNmNhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvTGlua2lmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKiBUZXN0cyBmb3Ige0BsaW5rIExpbmtpZmllcn0uICovCitwdWJsaWMgY2xhc3MgTGlua2lmaWVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IFJFUSA9IEZha2VIdHRwU2VydmxldFJlcXVlc3QubmV3UmVxdWVzdCgpOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdGxpbmtpZnlNZXNzYWdlTm9NYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpbmtpZmllciBsID0gbmV3IExpbmtpZmllcihUZXN0R2l0aWxlc1VybHMuVVJMUyk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgInNvbWUgbWVzc2FnZSB0ZXh0IikpLAorICAgICAgICBsLmxpbmtpZnkoRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdC5uZXdSZXF1ZXN0KCksICJzb21lIG1lc3NhZ2UgdGV4dCIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RsaW5raWZ5TWVzc2FnZVVybCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpbmtpZmllciBsID0gbmV3IExpbmtpZmllcihUZXN0R2l0aWxlc1VybHMuVVJMUyk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJodHRwOi8vbXkvdXJsIiwgInVybCIsICJodHRwOi8vbXkvdXJsIikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiaHR0cDovL215L3VybCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImh0dHBzOi8vbXkvdXJsIiwgInVybCIsICJodHRwczovL215L3VybCIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgImh0dHBzOi8vbXkvdXJsIikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiZm9vICIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiaHR0cDovL215L3VybCIsICJ1cmwiLCAiaHR0cDovL215L3VybCIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiIGJhciIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgImZvbyBodHRwOi8vbXkvdXJsIGJhciIpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImZvbyAiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImh0dHA6Ly9teS91cmwiLCAidXJsIiwgImh0dHA6Ly9teS91cmwiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIiBiYXIgIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJodHRwOi8vbXkvb3RoZXIvdXJsIiwgInVybCIsICJodHRwOi8vbXkvb3RoZXIvdXJsIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICIgYmF6IikpLAorICAgICAgICBsLmxpbmtpZnkoUkVRLCAiZm9vIGh0dHA6Ly9teS91cmwgYmFyIGh0dHA6Ly9teS9vdGhlci91cmwgYmF6IikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdGxpbmtpZnlNZXNzYWdlQ2hhbmdlSWROb0dlcnJpdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpbmtpZmllciBsID0gbmV3IExpbmtpZmllcihuZXcgR2l0aWxlc1VybHMoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUdlcnJpdFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VHaXRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZihJbW11dGFibGVNYXAub2YoInRleHQiLCAiSTAxMjM0NTY3ODkiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJJMDEyMzQ1Njc4OSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZihJbW11dGFibGVNYXAub2YoInRleHQiLCAiQ2hhbmdlLUlkOiBJMDEyMzQ1Njc4OSIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgIkNoYW5nZS1JZDogSTAxMjM0NTY3ODkiKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkNoYW5nZS1JZDogSTAxMjM0NTY3ODkgZG9lcyBub3QgZXhpc3QiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJDaGFuZ2UtSWQ6IEkwMTIzNDU2Nzg5IGRvZXMgbm90IGV4aXN0IikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdGxpbmtpZnlNZXNzYWdlQ2hhbmdlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaW5raWZpZXIgbCA9IG5ldyBMaW5raWZpZXIoVGVzdEdpdGlsZXNVcmxzLlVSTFMpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiSTAxMjM0NTY3ODkiLAorICAgICAgICAgICJ1cmwiLCAiaHR0cDovL3Rlc3QtaG9zdC1yZXZpZXcvZm9vLyMvcS9JMDEyMzQ1Njc4OSxuLHoiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJJMDEyMzQ1Njc4OSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIkNoYW5nZS1JZDogIiksCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJJMDEyMzQ1Njc4OSIsCisgICAgICAgICAgInVybCIsICJodHRwOi8vdGVzdC1ob3N0LXJldmlldy9mb28vIy9xL0kwMTIzNDU2Nzg5LG4seiIpKSwKKyAgICAgICAgbC5saW5raWZ5KFJFUSwgIkNoYW5nZS1JZDogSTAxMjM0NTY3ODkiKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIEltbXV0YWJsZU1hcC5vZigidGV4dCIsICJDaGFuZ2UtSWQ6ICIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiSTAxMjM0NTY3ODkiLAorICAgICAgICAgICJ1cmwiLCAiaHR0cDovL3Rlc3QtaG9zdC1yZXZpZXcvZm9vLyMvcS9JMDEyMzQ1Njc4OSxuLHoiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIiBleGlzdHMiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJDaGFuZ2UtSWQ6IEkwMTIzNDU2Nzg5IGV4aXN0cyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RsaW5raWZ5TWVzc2FnZVVybEFuZENoYW5nZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlua2lmaWVyIGwgPSBuZXcgTGlua2lmaWVyKFRlc3RHaXRpbGVzVXJscy5VUkxTKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgImh0dHA6Ly9teS91cmwvSTAxMjM0NTY3ODkiLCAidXJsIiwgImh0dHA6Ly9teS91cmwvSTAxMjM0NTY3ODkiKSwKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCJ0ZXh0IiwgIiBpcyBub3QgY2hhbmdlICIpLAorICAgICAgICBJbW11dGFibGVNYXAub2YoInRleHQiLCAiSTAxMjM0NTY3ODkiLAorICAgICAgICAgICJ1cmwiLCAiaHR0cDovL3Rlc3QtaG9zdC1yZXZpZXcvZm9vLyMvcS9JMDEyMzQ1Njc4OSxuLHoiKSksCisgICAgICAgIGwubGlua2lmeShSRVEsICJodHRwOi8vbXkvdXJsL0kwMTIzNDU2Nzg5IGlzIG5vdCBjaGFuZ2UgSTAxMjM0NTY3ODkiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9QYWdpbmF0b3JUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGFnaW5hdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjYxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUGFnaW5hdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkluTWVtb3J5UmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIExvZ1NlcnZsZXR9LiAqLworcHVibGljIGNsYXNzIFBhZ2luYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgVGVzdFJlcG9zaXRvcnk8RGZzUmVwb3NpdG9yeT4gcmVwbzsKKyAgcHJpdmF0ZSBSZXZXYWxrIHdhbGs7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwbyA9IG5ldyBUZXN0UmVwb3NpdG9yeTxEZnNSZXBvc2l0b3J5PigKKyAgICAgICAgbmV3IEluTWVtb3J5UmVwb3NpdG9yeShuZXcgRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uKCJ0ZXN0IikpKTsKKyAgICB3YWxrID0gbmV3IFJldldhbGsocmVwby5nZXRSZXBvc2l0b3J5KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgd2Fsay5yZWxlYXNlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJldkNvbW1pdD4gY29tbWl0cyA9IGxpbmVhckNvbW1pdHMoMTApOworICAgIHdhbGsubWFya1N0YXJ0KGNvbW1pdHMuZ2V0KDkpKTsKKyAgICBQYWdpbmF0b3IgcCA9IG5ldyBQYWdpbmF0b3Iod2FsaywgMywgY29tbWl0cy5nZXQoOSkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDkpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoOCksCisgICAgICAgICAgICBjb21taXRzLmdldCg3KSksCisgICAgICAgIEltbXV0YWJsZUxpc3QuY29weU9mKHApKTsKKyAgICBhc3NlcnROdWxsKHAuZ2V0UHJldmlvdXNTdGFydCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoNiksIHAuZ2V0TmV4dFN0YXJ0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5vU3RhcnRDb21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJldkNvbW1pdD4gY29tbWl0cyA9IGxpbmVhckNvbW1pdHMoMTApOworICAgIHdhbGsubWFya1N0YXJ0KGNvbW1pdHMuZ2V0KDkpKTsKKyAgICBQYWdpbmF0b3IgcCA9IG5ldyBQYWdpbmF0b3Iod2FsaywgMywgbnVsbCk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgY29tbWl0cy5nZXQoOSksCisgICAgICAgICAgICBjb21taXRzLmdldCg4KSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDcpKSwKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YocCkpOworICAgIGFzc2VydE51bGwocC5nZXRQcmV2aW91c1N0YXJ0KCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg2KSwgcC5nZXROZXh0U3RhcnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TGVzc1RoYW5PbmVQYWdlSW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJldkNvbW1pdD4gY29tbWl0cyA9IGxpbmVhckNvbW1pdHMoMTApOworICAgIHdhbGsubWFya1N0YXJ0KGNvbW1pdHMuZ2V0KDkpKTsKKyAgICBQYWdpbmF0b3IgcCA9IG5ldyBQYWdpbmF0b3Iod2FsaywgMywgY29tbWl0cy5nZXQoOCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDgpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoNyksCisgICAgICAgICAgICBjb21taXRzLmdldCg2KSksCisgICAgICAgIEltbXV0YWJsZUxpc3QuY29weU9mKHApKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoOSksIHAuZ2V0UHJldmlvdXNTdGFydCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoNSksIHAuZ2V0TmV4dFN0YXJ0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEF0TGVhc3RPbmVQYWdlSW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFJldkNvbW1pdD4gY29tbWl0cyA9IGxpbmVhckNvbW1pdHMoMTApOworICAgIHdhbGsubWFya1N0YXJ0KGNvbW1pdHMuZ2V0KDkpKTsKKyAgICBQYWdpbmF0b3IgcCA9IG5ldyBQYWdpbmF0b3Iod2FsaywgMywgY29tbWl0cy5nZXQoNykpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDcpLAorICAgICAgICAgICAgY29tbWl0cy5nZXQoNiksCisgICAgICAgICAgICBjb21taXRzLmdldCg1KSksCisgICAgICAgIEltbXV0YWJsZUxpc3QuY29weU9mKHApKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoOSksIHAuZ2V0UHJldmlvdXNTdGFydCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoNCksIHAuZ2V0TmV4dFN0YXJ0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gbGluZWFyQ29tbWl0cygxMCk7CisgICAgd2Fsay5tYXJrU3RhcnQoY29tbWl0cy5nZXQoOSkpOworICAgIFBhZ2luYXRvciBwID0gbmV3IFBhZ2luYXRvcih3YWxrLCAzLCBjb21taXRzLmdldCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgY29tbWl0cy5nZXQoMiksCisgICAgICAgICAgICBjb21taXRzLmdldCgxKSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDApKSwKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YocCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg1KSwgcC5nZXRQcmV2aW91c1N0YXJ0KCkpOworICAgIGFzc2VydE51bGwocC5nZXROZXh0U3RhcnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T25lUGFzdEVuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8UmV2Q29tbWl0PiBjb21taXRzID0gbGluZWFyQ29tbWl0cygxMCk7CisgICAgd2Fsay5tYXJrU3RhcnQoY29tbWl0cy5nZXQoOSkpOworICAgIFBhZ2luYXRvciBwID0gbmV3IFBhZ2luYXRvcih3YWxrLCAzLCBjb21taXRzLmdldCgxKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgY29tbWl0cy5nZXQoMSksCisgICAgICAgICAgICBjb21taXRzLmdldCgwKSksCisgICAgICAgIEltbXV0YWJsZUxpc3QuY29weU9mKHApKTsKKyAgICBhc3NlcnRFcXVhbHMoY29tbWl0cy5nZXQoNCksIHAuZ2V0UHJldmlvdXNTdGFydCgpKTsKKyAgICBhc3NlcnROdWxsKHAuZ2V0TmV4dFN0YXJ0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1hbnlQYXN0RW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZDb21taXQ+IGNvbW1pdHMgPSBsaW5lYXJDb21taXRzKDEwKTsKKyAgICB3YWxrLm1hcmtTdGFydChjb21taXRzLmdldCg5KSk7CisgICAgUGFnaW5hdG9yIHAgPSBuZXcgUGFnaW5hdG9yKHdhbGssIDUsIGNvbW1pdHMuZ2V0KDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBjb21taXRzLmdldCgxKSwKKyAgICAgICAgICAgIGNvbW1pdHMuZ2V0KDApKSwKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YocCkpOworICAgIGFzc2VydEVxdWFscyhjb21taXRzLmdldCg2KSwgcC5nZXRQcmV2aW91c1N0YXJ0KCkpOworICAgIGFzc2VydE51bGwocC5nZXROZXh0U3RhcnQoKSk7CisgIH0KKworICBwcml2YXRlIExpc3Q8UmV2Q29tbWl0PiBsaW5lYXJDb21taXRzKGludCBuKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBjaGVja0FyZ3VtZW50KG4gPiAwKTsKKyAgICBMaXN0PFJldkNvbW1pdD4gY29tbWl0cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGNvbW1pdHMuYWRkKHJlcG8uY29tbWl0KCkuY3JlYXRlKCkpOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMTA7IGkrKykgeworICAgICAgY29tbWl0cy5hZGQocmVwby5jb21taXQoKS5wYXJlbnQoY29tbWl0cy5nZXQoY29tbWl0cy5zaXplKCkgLSAxKSkuY3JlYXRlKCkpOworICAgIH0KKyAgICByZXR1cm4gY29tbWl0czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlJbmRleFNlcnZsZXRUZXN0LmphdmEgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvUmVwb3NpdG9yeUluZGV4U2VydmxldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDcxZjcwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JlcG9zaXRvcnlJbmRleFNlcnZsZXRUZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5UZXN0R2l0aWxlc1VybHMuVVJMUzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIFRlc3RzIGZvciB7QGxpbmsgUmVwb3NpdG9yeUluZGV4U2VydmxldH0uICovCitwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUluZGV4U2VydmxldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgVGVzdFJlcG9zaXRvcnk8RGZzUmVwb3NpdG9yeT4gcmVwbzsKKyAgcHJpdmF0ZSBSZXBvc2l0b3J5SW5kZXhTZXJ2bGV0IHNlcnZsZXQ7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVwbyA9IG5ldyBUZXN0UmVwb3NpdG9yeTxEZnNSZXBvc2l0b3J5PigKKyAgICAgICAgbmV3IEluTWVtb3J5UmVwb3NpdG9yeShuZXcgRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uKCJ0ZXN0IikpKTsKKyAgICBzZXJ2bGV0ID0gbmV3IFJlcG9zaXRvcnlJbmRleFNlcnZsZXQoCisgICAgICAgIG5ldyBEZWZhdWx0UmVuZGVyZXIoKSwKKyAgICAgICAgbmV3IFRlc3RHaXRpbGVzQWNjZXNzKHJlcG8uZ2V0UmVwb3NpdG9yeSgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCA/PiBkYXRhID0gYnVpbGREYXRhKCk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3Qub2YoKSwgZGF0YS5nZXQoImJyYW5jaGVzIikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKCksIGRhdGEuZ2V0KCJ0YWdzIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJyYW5jaGVzQW5kVGFncygpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL2ZvbyIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL2JhciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJyZWZzL3RhZ3MvYmF6IikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goInJlZnMvbm9wZS9xdXV4IikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgTWFwPFN0cmluZywgPz4gZGF0YSA9IGJ1aWxkRGF0YSgpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvYmFyIiwgImJhciIpLAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvZm9vIiwgImZvbyIpKSwKKyAgICAgICAgZGF0YS5nZXQoImJyYW5jaGVzIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL2JheiIsICJiYXoiKSksCisgICAgICAgIGRhdGEuZ2V0KCJ0YWdzIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEFtYmlndW91c0JyYW5jaCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL2ZvbyIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL2JhciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJyZWZzL3RhZ3MvZm9vIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgTWFwPFN0cmluZywgPz4gZGF0YSA9IGJ1aWxkRGF0YSgpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvYmFyIiwgImJhciIpLAorICAgICAgICAgICAgcmVmKCIvYi90ZXN0LysvcmVmcy9oZWFkcy9mb28iLCAiZm9vIikpLAorICAgICAgICBkYXRhLmdldCgiYnJhbmNoZXMiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgLy8gcmVmcy90YWdzLyBpcyBzZWFyY2hlZCBiZWZvcmUgcmVmcy9oZWFkcy8sIHNvIHRoaXMgZG9lcyBub3QKKyAgICAgICAgICAgIC8vIGFwcGVhciBhbWJpZ3VvdXMuCisgICAgICAgICAgICByZWYoIi9iL3Rlc3QvKy9mb28iLCAiZm9vIikpLAorICAgICAgICBkYXRhLmdldCgidGFncyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNSZWxhdGl2ZVRvTm9uQnJhbmNoT3JUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9mb28iKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9mb28iKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgicmVmcy90YWdzL2ZvbyIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIE1hcDxTdHJpbmcsID8+IGRhdGEgPSBidWlsZERhdGEoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL3JlZnMvaGVhZHMvZm9vIiwgImZvbyIpKSwKKyAgICAgICAgZGF0YS5nZXQoImJyYW5jaGVzIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL3JlZnMvdGFncy9mb28iLCAiZm9vIikpLAorICAgICAgICBkYXRhLmdldCgidGFncyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWZzSGVhZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9mb28iKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9yZWZzL2hlYWRzL2ZvbyIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIE1hcDxTdHJpbmcsID8+IGRhdGEgPSBidWlsZERhdGEoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL2ZvbyIsICJmb28iKSwKKyAgICAgICAgICAgIHJlZigiL2IvdGVzdC8rL3JlZnMvaGVhZHMvcmVmcy9oZWFkcy9mb28iLCAicmVmcy9oZWFkcy9mb28iKSksCisgICAgICAgIGRhdGEuZ2V0KCJicmFuY2hlcyIpKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgPz4gYnVpbGREYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxID0gRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdC5uZXdSZXF1ZXN0KHJlcG8uZ2V0UmVwb3NpdG9yeSgpKTsKKyAgICBWaWV3RmlsdGVyLnNldFZpZXcocmVxLCBHaXRpbGVzVmlldy5yZXBvc2l0b3J5SW5kZXgoKQorICAgICAgICAuc2V0SG9zdE5hbWUoVVJMUy5nZXRIb3N0TmFtZShyZXEpKQorICAgICAgICAuc2V0U2VydmxldFBhdGgocmVxLmdldFNlcnZsZXRQYXRoKCkpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgidGVzdCIpCisgICAgICAgIC5idWlsZCgpKTsKKyAgICByZXR1cm4gc2VydmxldC5idWlsZERhdGEocmVxKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiByZWYoU3RyaW5nIHVybCwgU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCJ1cmwiLCB1cmwsICJuYW1lIiwgbmFtZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblBhcnNlclRlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9SZXZpc2lvblBhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzAzM2UwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1JldmlzaW9uUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjczIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQ09NTUlUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX1RBRzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdpdGlsZXMuUmV2aXNpb25QYXJzZXIuUmVzdWx0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2QmxvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OworCisvKiogVGVzdHMgZm9yIHRoZSByZXZpc2lvbiBwYXJzZXIuICovCitwdWJsaWMgY2xhc3MgUmV2aXNpb25QYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIFRlc3RSZXBvc2l0b3J5PERmc1JlcG9zaXRvcnk+IHJlcG87CisgIHByaXZhdGUgUmV2aXNpb25QYXJzZXIgcGFyc2VyOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlcG8gPSBuZXcgVGVzdFJlcG9zaXRvcnk8RGZzUmVwb3NpdG9yeT4oCisgICAgICAgIG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkobmV3IERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbigidGVzdCIpKSk7CisgICAgcGFyc2VyID0gbmV3IFJldmlzaW9uUGFyc2VyKAorICAgICAgICByZXBvLmdldFJlcG9zaXRvcnkoKSwKKyAgICAgICAgbmV3IFRlc3RHaXRpbGVzQWNjZXNzKHJlcG8uZ2V0UmVwb3NpdG9yeSgpKS5mb3JSZXF1ZXN0KG51bGwpLAorICAgICAgICBuZXcgVmlzaWJpbGl0eUNhY2hlKGZhbHNlLCBDYWNoZUJ1aWxkZXIubmV3QnVpbGRlcigpLm1heGltdW1TaXplKDApKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBtYXN0ZXIpKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKCJyZWZzL2hlYWRzL21hc3RlciIsIG1hc3RlcikpLAorICAgICAgICBwYXJzZXIucGFyc2UoInJlZnMvaGVhZHMvbWFzdGVyIikpOworICAgIGFzc2VydE51bGwocGFyc2VyLnBhcnNlKCJyZWZzLy9oZWFkcy8vbWFzdGVyIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlUmVmUGFyZW50RXhwcmVzc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCByb290ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgcGFyZW50MSA9IHJlcG8uY29tbWl0KCkucGFyZW50KHJvb3QpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBwYXJlbnQyID0gcmVwby5jb21taXQoKS5wYXJlbnQocm9vdCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IG1lcmdlID0gcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpCisgICAgICAgIC5wYXJlbnQocGFyZW50MSkKKyAgICAgICAgLnBhcmVudChwYXJlbnQyKQorICAgICAgICAuY3JlYXRlKCk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBtZXJnZSkpLCBwYXJzZXIucGFyc2UoIm1hc3RlciIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQxKSksIHBhcnNlci5wYXJzZSgibWFzdGVyXiIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcn4xIiwgcGFyZW50MSkpLCBwYXJzZXIucGFyc2UoIm1hc3Rlcn4xIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZCgibWFzdGVyXjIiLCBwYXJlbnQyKSksIHBhcnNlci5wYXJzZSgibWFzdGVyXjIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXJ+MiIsIHJvb3QpKSwgcGFyc2VyLnBhcnNlKCJtYXN0ZXJ+MiIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUNvbW1pdFNoYVZpc2libGVGcm9tSGVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBjb21taXQgPSByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKGNvbW1pdC5uYW1lKCksIGNvbW1pdCkpLCBwYXJzZXIucGFyc2UoY29tbWl0Lm5hbWUoKSkpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChwYXJlbnQubmFtZSgpLCBwYXJlbnQpKSwgcGFyc2VyLnBhcnNlKHBhcmVudC5uYW1lKCkpKTsKKworICAgIFN0cmluZyBhYmJyZXYgPSBjb21taXQubmFtZSgpLnN1YnN0cmluZygwLCA2KTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoYWJicmV2LCBjb21taXQpKSwgcGFyc2VyLnBhcnNlKGFiYnJldikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlQ29tbWl0U2hhVmlzaWJsZUZyb21UYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgY29tbWl0ID0gcmVwby5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKyAgICByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgcmVwby51cGRhdGUoInJlZnMvdGFncy90YWciLCByZXBvLnRhZygidGFnIiwgY29tbWl0KSk7CisKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQoY29tbWl0Lm5hbWUoKSwgY29tbWl0KSksIHBhcnNlci5wYXJzZShjb21taXQubmFtZSgpKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKHBhcmVudC5uYW1lKCksIHBhcmVudCkpLCBwYXJzZXIucGFyc2UocGFyZW50Lm5hbWUoKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlQ29tbWl0U2hhVmlzaWJsZUZyb21PdGhlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBjb21taXQgPSByZXBvLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworICAgIHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICByZXBvLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHJlcG8udGFnKCJ0YWciLCByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpKSk7CisgICAgcmVwby51cGRhdGUoInJlZnMvbWV0YS9jb25maWciLCBjb21taXQpOworCisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKGNvbW1pdC5uYW1lKCksIGNvbW1pdCkpLCBwYXJzZXIucGFyc2UoY29tbWl0Lm5hbWUoKSkpOworICAgIGFzc2VydEVxdWFscyhuZXcgUmVzdWx0KFJldmlzaW9uLnBlZWxlZChwYXJlbnQubmFtZSgpLCBwYXJlbnQpKSwgcGFyc2VyLnBhcnNlKHBhcmVudC5uYW1lKCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUNvbW1pdFNoYVZpc2libGVGcm9tQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IGNvbW1pdCA9IHJlcG8uY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisgICAgcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIHJlcG8udXBkYXRlKCJyZWZzL2NoYW5nZXMvMDEvMDAwMSIsIGNvbW1pdCk7CisKKyAgICAvLyBNYXRjaGVzIGV4YWN0bHkuCisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKGNvbW1pdC5uYW1lKCksIGNvbW1pdCkpLCBwYXJzZXIucGFyc2UoY29tbWl0Lm5hbWUoKSkpOworICAgIC8vIHJlZnMvY2hhbmdlcy8qIGlzIGV4Y2x1ZGVkIGZyb20gYW5jZXN0cnkgc2VhcmNoLgorICAgIGFzc2VydEVxdWFscyhudWxsLCBwYXJzZXIucGFyc2UocGFyZW50Lm5hbWUoKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlTm9uVmlzaWJsZUNvbW1pdFNoYSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBvdGhlciA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyc2VyLnBhcnNlKG90aGVyLm5hbWUoKSkpOworCisgICAgcmVwby5icmFuY2goIm90aGVyIikudXBkYXRlKG90aGVyKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IFJlc3VsdChSZXZpc2lvbi5wZWVsZWQob3RoZXIubmFtZSgpLCBvdGhlcikpLCBwYXJzZXIucGFyc2Uob3RoZXIubmFtZSgpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VEaWZmUmV2aXNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IGNvbW1pdCA9IHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgb3RoZXIgPSByZXBvLmJyYW5jaCgib3RoZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudCksCisgICAgICAgICAgICAxNSksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyXi4ubWFzdGVyIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudCksCisgICAgICAgICAgICAxNSksCisgICAgICAgIHBhcnNlci5wYXJzZSgibWFzdGVyXi4ubWFzdGVyLyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQpLAorICAgICAgICAgICAgMTUpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlcl4uLm1hc3Rlci9wYXRoL3RvL2EvZmlsZSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIGNvbW1pdCksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQpLAorICAgICAgICAgICAgMTUpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlcl4uLm1hc3Rlci9wYXRoL3RvL2EvLi5maWxlIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgicmVmcy9oZWFkcy9tYXN0ZXIiLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJyZWZzL2hlYWRzL21hc3Rlcl4iLCBwYXJlbnQpLAorICAgICAgICAgICAgMzcpLAorICAgICAgcGFyc2VyLnBhcnNlKCJyZWZzL2hlYWRzL21hc3Rlcl4uLnJlZnMvaGVhZHMvbWFzdGVyIikpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyfjEiLCBwYXJlbnQpLAorICAgICAgICAgICAgMTYpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlcn4xLi5tYXN0ZXIiKSk7CisgICAgLy8gVE9ETyhkYm9yb3dpdHopOiAyYTIzNjJmYmIgaW4gSkdpdCBjYXVzZXMgbWFzdGVyfjIgdG8gcmVzb2x2ZSB0byBtYXN0ZXIKKyAgICAvLyByYXRoZXIgdGhhbiBudWxsLiBVbmNvbW1lbnQgd2hlbiB1cHN0cmVhbSByZWdyZXNzaW9uIGlzIGZpeGVkLgorICAgIC8vYXNzZXJ0TnVsbChwYXJzZXIucGFyc2UoIm1hc3Rlcn4yLi5tYXN0ZXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJtYXN0ZXIiLCBjb21taXQpLAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJvdGhlciIsIG90aGVyKSwKKyAgICAgICAgICAgIDEzKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJvdGhlci4ubWFzdGVyIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlRmlyc3RQYXJlbnRFeHByZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IGNvbW1pdCA9IHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyXiIsIHBhcmVudCksCisgICAgICAgICAgICA4KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXJeISIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3Rlcl4iLCBwYXJlbnQpLAorICAgICAgICAgICAgUmV2aXNpb24uTlVMTCwKKyAgICAgICAgICAgIDkpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlcl5eISIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQocGFyZW50Lm5hbWUoKSwgcGFyZW50KSwKKyAgICAgICAgICAgIFJldmlzaW9uLk5VTEwsCisgICAgICAgICAgICA0MiksCisgICAgICAgIHBhcnNlci5wYXJzZShwYXJlbnQubmFtZSgpICsgIl4hIikpOworCisgICAgUmV2VGFnIHRhZyA9IHJlcG8udXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgcmVwby50YWcoInRhZyIsIGNvbW1pdCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFJlc3VsdCgKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgidGFnIiwgY29tbWl0KSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgidGFnXiIsIHBhcmVudCksCisgICAgICAgICAgICA1KSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJ0YWdeISIpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoInRhZ14iLCBwYXJlbnQpLAorICAgICAgICAgICAgUmV2aXNpb24uTlVMTCwKKyAgICAgICAgICAgIDYpLAorICAgICAgICBwYXJzZXIucGFyc2UoInRhZ15eISIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb25WaXNpYmxlRGlmZlNoYXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgb3RoZXIgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgibWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHBhcnNlci5wYXJzZSgib3RoZXIuLm1hc3RlciIpKTsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyc2VyLnBhcnNlKCJtYXN0ZXIuLm90aGVyIikpOworCisgICAgcmVwby5icmFuY2goIm90aGVyIikudXBkYXRlKG90aGVyKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBSZXN1bHQoCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm1hc3RlciIsIG1hc3RlciksCisgICAgICAgICAgICBSZXZpc2lvbi5wZWVsZWQoIm90aGVyIiwgb3RoZXIpLAorICAgICAgICAgICAgMTMpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm90aGVyLi5tYXN0ZXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0KAorICAgICAgICAgICAgUmV2aXNpb24ucGVlbGVkKCJvdGhlciIsIG90aGVyKSwKKyAgICAgICAgICAgIFJldmlzaW9uLnBlZWxlZCgibWFzdGVyIiwgbWFzdGVyKSwKKyAgICAgICAgICAgIDEzKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXIuLm90aGVyIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZUYWcgbWFzdGVyVGFnID0gcmVwby51cGRhdGUoInJlZnMvdGFncy9tYXN0ZXItdGFnIiwgcmVwby50YWcoIm1hc3Rlci10YWciLCBtYXN0ZXIpKTsKKyAgICBSZXZUYWcgbWFzdGVyVGFnVGFnID0gcmVwby51cGRhdGUoInJlZnMvdGFncy9tYXN0ZXItdGFnLXRhZyIsCisgICAgICAgIHJlcG8udGFnKCJtYXN0ZXItdGFnLXRhZyIsIG1hc3RlcikpOworCisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoCisgICAgICAgICAgICBuZXcgUmV2aXNpb24oIm1hc3Rlci10YWciLCBtYXN0ZXJUYWcsIE9CSl9UQUcsIG1hc3RlciwgT0JKX0NPTU1JVCkpLAorICAgICAgICBwYXJzZXIucGFyc2UoIm1hc3Rlci10YWciKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoCisgICAgICAgICAgICBuZXcgUmV2aXNpb24oIm1hc3Rlci10YWctdGFnIiwgbWFzdGVyVGFnVGFnLCBPQkpfVEFHLCBtYXN0ZXIsIE9CSl9DT01NSVQpKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKCJtYXN0ZXItdGFnLXRhZyIpKTsKKworICAgIFJldkJsb2IgYmxvYiA9IHJlcG8udXBkYXRlKCJyZWZzL3RhZ3MvYmxvYiIsIHJlcG8uYmxvYigiYmxvYiIpKTsKKyAgICBSZXZUYWcgYmxvYlRhZyA9IHJlcG8udXBkYXRlKCJyZWZzL3RhZ3MvYmxvYi10YWciLCByZXBvLnRhZygiYmxvYi10YWciLCBibG9iKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQoUmV2aXNpb24ucGVlbGVkKCJibG9iIiwgYmxvYikpLCBwYXJzZXIucGFyc2UoImJsb2IiKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZXN1bHQobmV3IFJldmlzaW9uKCJibG9iLXRhZyIsIGJsb2JUYWcsIE9CSl9UQUcsIGJsb2IsIE9CSl9CTE9CKSksCisgICAgICAgIHBhcnNlci5wYXJzZSgiYmxvYi10YWciKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVbnN1cHBvcnRlZFJldmlzaW9uRXhwcmVzc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZCbG9iIGJsb2IgPSByZXBvLmJsb2IoImJsb2IgY29udGVudHMiKTsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLmFkZCgiYmxvYiIsIGJsb2IpLmNyZWF0ZSgpOworCisgICAgYXNzZXJ0RXF1YWxzKG1hc3RlciwgcmVwby5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgibWFzdGVyXnt9IikpOworICAgIGFzc2VydEVxdWFscyhudWxsLCBwYXJzZXIucGFyc2UoIm1hc3Rlcl57fSIpKTsKKworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHJlcG8uZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoIm1hc3Rlcl57Y29tbWl0fSIpKTsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyc2VyLnBhcnNlKCJtYXN0ZXJee2NvbW1pdH0iKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoYmxvYiwgcmVwby5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgibWFzdGVyOmJsb2IiKSk7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHBhcnNlci5wYXJzZSgibWFzdGVyOmJsb2IiKSk7CisKKyAgICAvLyBUZXN0UmVwb3NpdG9yeSBoYXMgbm8gc2ltcGxlIHdheSBvZiBzZXR0aW5nIHRoZSByZWZsb2cuCisgICAgLy9hc3NlcnRFcXVhbHMobnVsbCwgcmVwby5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgibWFzdGVyQHswfSIpKTsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGFyc2VyLnBhcnNlKCJtYXN0ZXJAezB9IikpOworICB9Cit9CmRpZmYgLS1naXQgYS9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGVzdEdpdGlsZXNBY2Nlc3MuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UZXN0R2l0aWxlc0FjY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzFlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9naXRpbGVzLXNlcnZsZXQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dpdGlsZXMvVGVzdEdpdGlsZXNBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIEdpdGlsZXMgYWNjZXNzIGZvciB0ZXN0aW5nLiAqLworcHVibGljIGNsYXNzIFRlc3RHaXRpbGVzQWNjZXNzIGltcGxlbWVudHMgR2l0aWxlc0FjY2Vzcy5GYWN0b3J5IHsKKyAgcHJpdmF0ZSBmaW5hbCBEZnNSZXBvc2l0b3J5IHJlcG87CisKKyAgcHVibGljIFRlc3RHaXRpbGVzQWNjZXNzKERmc1JlcG9zaXRvcnkgcmVwbykgeworICAgIHRoaXMucmVwbyA9IGNoZWNrTm90TnVsbChyZXBvKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR2l0aWxlc0FjY2VzcyBmb3JSZXF1ZXN0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gbmV3IEdpdGlsZXNBY2Nlc3MoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBSZXBvc2l0b3J5RGVzY3JpcHRpb24+IGxpc3RSZXBvc2l0b3JpZXMoU2V0PFN0cmluZz4gYnJhbmNoZXMpIHsKKyAgICAgICAgLy8gVE9ETyhkYm9yb3dpdHopOiBJbXBsZW1lbnQgdGhpcywgdXNpbmcgdGhlIERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbnMgdG8KKyAgICAgICAgLy8gZ2V0IHRoZSByZXBvc2l0b3J5IG5hbWVzLgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJLZXkoKSB7CisgICAgICAgIHJldHVybiAiYSB1c2VyIjsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlOYW1lKCkgeworICAgICAgICByZXR1cm4gcmVwby5nZXREZXNjcmlwdGlvbigpLmdldFJlcG9zaXRvcnlOYW1lKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBnZXRSZXBvc2l0b3J5RGVzY3JpcHRpb24oKSB7CisgICAgICAgIFJlcG9zaXRvcnlEZXNjcmlwdGlvbiBkID0gbmV3IFJlcG9zaXRvcnlEZXNjcmlwdGlvbigpOworICAgICAgICBkLm5hbWUgPSBnZXRSZXBvc2l0b3J5TmFtZSgpOworICAgICAgICBkLmRlc2NyaXB0aW9uID0gImEgdGVzdCBkYXRhIHNldCI7CisgICAgICAgIGQuY2xvbmVVcmwgPSBUZXN0R2l0aWxlc1VybHMuVVJMUy5nZXRCYXNlR2l0VXJsKHJlcSkgKyAiLyIgKyBkLm5hbWU7CisgICAgICAgIHJldHVybiBkOworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UZXN0R2l0aWxlc1VybHMuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UZXN0R2l0aWxlc1VybHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGEwODgzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1Rlc3RHaXRpbGVzVXJscy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqIHtAbGluayBHaXRpbGVzVXJsc30gZm9yIHRlc3RpbmcuICovCitwdWJsaWMgY2xhc3MgVGVzdEdpdGlsZXNVcmxzIGltcGxlbWVudHMgR2l0aWxlc1VybHMgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIEdpdGlsZXNVcmxzIFVSTFMgPSBuZXcgVGVzdEdpdGlsZXNVcmxzKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHJldHVybiAidGVzdC1ob3N0IjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEJhc2VHaXRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIHJldHVybiAiZ2l0Oi8vdGVzdC1ob3N0L2ZvbyI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRCYXNlR2Vycml0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gImh0dHA6Ly90ZXN0LWhvc3QtcmV2aWV3L2Zvby8iOworICB9CisKKyAgcHJpdmF0ZSBUZXN0R2l0aWxlc1VybHMoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UcmVlU295RGF0YVRlc3QuamF2YSBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9UcmVlU295RGF0YVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQyM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1RyZWVTb3lEYXRhVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5naXRpbGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5UcmVlU295RGF0YS5nZXRUYXJnZXREaXNwbGF5TmFtZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5naXRpbGVzLlRyZWVTb3lEYXRhLnJlc29sdmVUYXJnZXRVcmw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKKworLyoqIFRlc3RzIGZvciB7QGxpbmsgVHJlZVNveURhdGF9LiAqLworcHVibGljIGNsYXNzIFRyZWVTb3lEYXRhVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdEdldFRhcmdldERpc3BsYXlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRUYXJnZXREaXNwbGF5TmFtZSgiZm9vIikpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIGdldFRhcmdldERpc3BsYXlOYW1lKCJmb28vYmFyIikpOworICAgIGFzc2VydEVxdWFscygiYS9hL2EvYS9hL2EvYS9hL2EvYS9iYXIiLAorICAgICAgICBnZXRUYXJnZXREaXNwbGF5TmFtZShTdHJpbmdzLnJlcGVhdCgiYS8iLCAxMCkgKyAiYmFyIikpOworICAgIGFzc2VydEVxdWFscygiYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9hL2EvYS9iYXIiLAorICAgICAgICBnZXRUYXJnZXREaXNwbGF5TmFtZShTdHJpbmdzLnJlcGVhdCgiYS8iLCAzNCkgKyAiYmFyIikpOworICAgIGFzc2VydEVxdWFscygiLi4uL2JhciIsIGdldFRhcmdldERpc3BsYXlOYW1lKFN0cmluZ3MucmVwZWF0KCJhLyIsIDM1KSArICJiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIuLi4vYmFyIiwgZ2V0VGFyZ2V0RGlzcGxheU5hbWUoU3RyaW5ncy5yZXBlYXQoImEvIiwgMTAwKSArICJiYXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsCisgICAgICAgIGdldFRhcmdldERpc3BsYXlOYW1lKFN0cmluZ3MucmVwZWF0KCJhIiwgODApKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRhcmdldFVybCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE9iamVjdElkIGlkID0gT2JqZWN0SWQuZnJvbVN0cmluZygiYWJjZDEyMzRhYmNkMTIzNGFiY2QxMjM0YWJjZDEyMzRhYmNkMTIzNCIpOworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBHaXRpbGVzVmlldy5wYXRoKCkKKyAgICAgICAgLnNldFNlcnZsZXRQYXRoKCIveCIpCisgICAgICAgIC5zZXRIb3N0TmFtZSgiaG9zdCIpCisgICAgICAgIC5zZXRSZXBvc2l0b3J5TmFtZSgicmVwbyIpCisgICAgICAgIC5zZXRSZXZpc2lvbihSZXZpc2lvbi51bnBlZWxlZCgibSIsIGlkKSkKKyAgICAgICAgLnNldFRyZWVQYXRoKCJhL2IvYyIpCisgICAgICAgIC5idWlsZCgpOworICAgIGFzc2VydE51bGwocmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiL2ZvbyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi94L3JlcG8vKy9tL2EiLCByZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi8uLi8iKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIveC9yZXBvLysvbS9hIiwgcmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vLi8uLi8iKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIveC9yZXBvLysvbS9hIiwgcmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vLy4uLyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi94L3JlcG8vKy9tL2EvZCIsIHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uLy4uL2QiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIveC9yZXBvLysvbS8iLCByZXNvbHZlVGFyZ2V0VXJsKHZpZXcsICIuLi8uLi8uLiIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIi94L3JlcG8vKy9tL2EvZC9lIiwgcmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vLi4vZC9lIikpOworICAgIGFzc2VydEVxdWFscygiL3gvcmVwby8rL20vYS9iIiwgcmVzb2x2ZVRhcmdldFVybCh2aWV3LCAiLi4vZC8uLi9lLy4uLyIpKTsKKyAgICBhc3NlcnROdWxsKHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uLy4uLy4uLy4uLyIpKTsKKyAgICBhc3NlcnROdWxsKHJlc29sdmVUYXJnZXRVcmwodmlldywgIi4uLy4uL2EvLi4vLi4vLi4iKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaWV3RmlsdGVyVGVzdC5qYXZhIGIvZ2l0aWxlcy1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9naXRpbGVzL1ZpZXdGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyN2I5ZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdGlsZXMtc2VydmxldC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2l0aWxlcy9WaWV3RmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQ2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2l0aWxlczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdC5uZXdSZXF1ZXN0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdpdGlsZXMuR2l0aWxlc0ZpbHRlci5SRVBPX1BBVEhfUkVHRVg7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzRmlsdGVyLlJFUE9fUkVHRVg7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2l0aWxlcy5HaXRpbGVzRmlsdGVyLlJPT1RfUkVHRVg7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkF0b21pY3M7CitpbXBvcnQgY29tLmdvb2dsZS5naXRpbGVzLkdpdGlsZXNWaWV3LlR5cGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWUuTWV0YUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWUuTWV0YVNlcnZsZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZGZzLkluTWVtb3J5UmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIFRlc3RzIGZvciB0aGUgdmlldyBmaWx0ZXIuICovCitwdWJsaWMgY2xhc3MgVmlld0ZpbHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgVGVzdFJlcG9zaXRvcnk8RGZzUmVwb3NpdG9yeT4gcmVwbzsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXBvID0gbmV3IFRlc3RSZXBvc2l0b3J5PERmc1JlcG9zaXRvcnk+KAorICAgICAgICBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KG5ldyBEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24oInRlc3QiKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5vQ29tbWFuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhUeXBlLkhPU1RfSU5ERVgsIGdldFZpZXcoIi8iKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFUE9TSVRPUllfSU5ERVgsIGdldFZpZXcoIi9yZXBvIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnROdWxsKGdldFZpZXcoIi9yZXBvLysiKSk7CisgICAgYXNzZXJ0TnVsbChnZXRWaWV3KCIvcmVwby8rLyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RBdXRvQ29tbWFuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBwYXJlbnQgPSByZXBvLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKS5jb21taXQoKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKyAgICBTdHJpbmcgaGV4ID0gbWFzdGVyLm5hbWUoKTsKKyAgICBTdHJpbmcgaGV4QnJhbmNoID0gaGV4LnN1YnN0cmluZygwLCAxMCk7CisgICAgUmV2Q29tbWl0IGhleENvbW1pdCA9IHJlcG8uYnJhbmNoKGhleEJyYW5jaCkuY29tbWl0KCkuY3JlYXRlKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIGdldFZpZXcoIi9yZXBvLysvbWFzdGVyIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIGdldFZpZXcoIi9yZXBvLysvIiArIGhleEJyYW5jaCkuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgZ2V0VmlldygiL3JlcG8vKy8iICsgaGV4KS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCBnZXRWaWV3KCIvcmVwby8rLyIgKyBoZXguc3Vic3RyaW5nKDAsIDcpKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIGdldFZpZXcoIi9yZXBvLysvbWFzdGVyLyIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgZ2V0VmlldygiL3JlcG8vKy8iICsgaGV4ICsgIi8iKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIGdldFZpZXcoIi9yZXBvLysvbWFzdGVyXi4ubWFzdGVyIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCBnZXRWaWV3KCIvcmVwby8rL21hc3Rlcl4uLm1hc3Rlci8iKS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIGdldFZpZXcoIi9yZXBvLysvIiArIHBhcmVudC5uYW1lKCkgKyAiLi4iICsgaGV4ICsgIi8iKS5nZXRUeXBlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEhvc3RJbmRleCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBnZXRWaWV3KCIvIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuSE9TVF9JTkRFWCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygidGVzdC1ob3N0Iiwgdmlldy5nZXRIb3N0TmFtZSgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0UmV2aXNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlJbmRleCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEdpdGlsZXNWaWV3IHZpZXcgPSBnZXRWaWV3KCIvcmVwbyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFUE9TSVRPUllfSU5ERVgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlcG8iLCB2aWV3LmdldFJlcG9zaXRvcnlOYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldFJldmlzaW9uKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCcmFuY2hlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFJldkNvbW1pdCBtYXN0ZXIgPSByZXBvLmJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgc3RhYmxlID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvc3RhYmxlIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgR2l0aWxlc1ZpZXcgdmlldzsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9tYXN0ZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9oZWFkcy9tYXN0ZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaGVhZHMvbWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydE51bGwodmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9yZWZzL2hlYWRzL21hc3RlciIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlJFVklTSU9OLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJyZWZzL2hlYWRzL21hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvc3RhYmxlIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInN0YWJsZSIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhzdGFibGUsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzQnJhbmNoQW5kVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IGJyYW5jaCA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL25hbWUiKS5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgdGFnID0gcmVwby5icmFuY2goInJlZnMvdGFncy9uYW1lIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgR2l0aWxlc1ZpZXcgdmlldzsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9uYW1lIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHModGFnLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L2hlYWRzL25hbWUiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygiaGVhZHMvbmFtZSIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhicmFuY2gsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvcmVmcy9oZWFkcy9uYW1lIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbmFtZSIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhicmFuY2gsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvdGFncy9uYW1lIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVWSVNJT04sIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInRhZ3MvbmFtZSIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyh0YWcsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnROdWxsKHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvcmVmcy90YWdzL25hbWUiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVZJU0lPTiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygicmVmcy90YWdzL25hbWUiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHModGFnLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0TnVsbCh2aWV3LmdldFRyZWVQYXRoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgR2l0aWxlc1ZpZXcgdmlldzsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rc2hvdy9tYXN0ZXIvIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvbWFzdGVyL2ZvbyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLlBBVEgsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytzaG93L21hc3Rlci9mb28vIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUEFUSCwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK3Nob3cvbWFzdGVyL2Zvby9iYXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5QQVRILCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTbGFzaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpLmNvbW1pdCgpLmNyZWF0ZSgpOworICAgIEdpdGlsZXNWaWV3IHZpZXc7CisKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5IT1NUX0lOREVYLCBnZXRWaWV3KCIvLyIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuUkVQT1NJVE9SWV9JTkRFWCwgZ2V0VmlldygiLy9yZXBvIikuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5SRVBPU0lUT1JZX0lOREVYLCBnZXRWaWV3KCIvL3JlcG8vLyIpLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0TnVsbChnZXRWaWV3KCIvcmVwby8rLy9tYXN0ZXIiKSk7CisgICAgYXNzZXJ0TnVsbChnZXRWaWV3KCIvcmVwby8rL3JlZnMvL2hlYWRzLy9tYXN0ZXIiKSk7CisgICAgYXNzZXJ0TnVsbChnZXRWaWV3KCIvcmVwby8rLy9tYXN0ZXIvLyIpKTsKKyAgICBhc3NlcnROdWxsKGdldFZpZXcoIi9yZXBvLysvL21hc3Rlci9mb28vL2JhciIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REaWZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmV2Q29tbWl0IHBhcmVudCA9IHJlcG8uY29tbWl0KCkuY3JlYXRlKCk7CisgICAgUmV2Q29tbWl0IG1hc3RlciA9IHJlcG8uYnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpLmNvbW1pdCgpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworICAgIEdpdGlsZXNWaWV3IHZpZXc7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2RpZmYvbWFzdGVyXi4ubWFzdGVyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2RpZmYvbWFzdGVyXi4ubWFzdGVyLyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkRJRkYsIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytkaWZmL21hc3Rlcl4uLm1hc3Rlci9mb28iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5ESUZGLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rZGlmZi9yZWZzL2hlYWRzL21hc3Rlcl4uLnJlZnMvaGVhZHMvbWFzdGVyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygicmVmcy9oZWFkcy9tYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJyZWZzL2hlYWRzL21hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERpZmZBZ2FpbnN0RW1wdHlDb21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIikuY29tbWl0KCkuY3JlYXRlKCk7CisgICAgR2l0aWxlc1ZpZXcgdmlldyA9IGdldFZpZXcoIi9yZXBvLytkaWZmL21hc3Rlcl4hIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuRElGRiwgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBSZXZDb21taXQgcGFyZW50ID0gcmVwby5jb21taXQoKS5jcmVhdGUoKTsKKyAgICBSZXZDb21taXQgbWFzdGVyID0gcmVwby5icmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIikuY29tbWl0KCkucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisgICAgR2l0aWxlc1ZpZXcgdmlldzsKKworICAgIGFzc2VydE51bGwoZ2V0VmlldygiL3JlcG8vK2xvZyIpKTsKKyAgICBhc3NlcnROdWxsKGdldFZpZXcoIi9yZXBvLytsb2cvIikpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytsb2cvbWFzdGVyIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFJldmlzaW9uLk5VTEwsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytsb2cvbWFzdGVyLyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscyhSZXZpc2lvbi5OVUxMLCB2aWV3LmdldE9sZFJldmlzaW9uKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rbG9nL21hc3Rlci9mb28iKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUmV2aXNpb24uTlVMTCwgdmlldy5nZXRPbGRSZXZpc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2xvZy9tYXN0ZXJeLi5tYXN0ZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3RlciIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhtYXN0ZXIsIHZpZXcuZ2V0UmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIm1hc3Rlcl4iLCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyZW50LCB2aWV3LmdldE9sZFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCB2aWV3LmdldFRyZWVQYXRoKCkpOworCisgICAgdmlldyA9IGdldFZpZXcoIi9yZXBvLytsb2cvbWFzdGVyXi4ubWFzdGVyLyIpOworICAgIGFzc2VydEVxdWFscyhUeXBlLkxPRywgdmlldy5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygibWFzdGVyXiIsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnQsIHZpZXcuZ2V0T2xkUmV2aXNpb24oKS5nZXRJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIHZpZXcuZ2V0VHJlZVBhdGgoKSk7CisKKyAgICB2aWV3ID0gZ2V0VmlldygiL3JlcG8vK2xvZy9tYXN0ZXJeLi5tYXN0ZXIvZm9vIik7CisgICAgYXNzZXJ0RXF1YWxzKFR5cGUuTE9HLCB2aWV3LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXIiLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFzdGVyLCB2aWV3LmdldFJldmlzaW9uKCkuZ2V0SWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJtYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKworICAgIHZpZXcgPSBnZXRWaWV3KCIvcmVwby8rbG9nL3JlZnMvaGVhZHMvbWFzdGVyXi4ucmVmcy9oZWFkcy9tYXN0ZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoVHlwZS5MT0csIHZpZXcuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyIiwgdmlldy5nZXRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1hc3Rlciwgdmlldy5nZXRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygicmVmcy9oZWFkcy9tYXN0ZXJeIiwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudCwgdmlldy5nZXRPbGRSZXZpc2lvbigpLmdldElkKCkpOworICAgIGFzc2VydEVxdWFscygiIiwgdmlldy5nZXRUcmVlUGF0aCgpKTsKKyAgfQorCisgIHByaXZhdGUgR2l0aWxlc1ZpZXcgZ2V0VmlldyhTdHJpbmcgcGF0aEFuZFF1ZXJ5KSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxHaXRpbGVzVmlldz4gdmlldyA9IEF0b21pY3MubmV3UmVmZXJlbmNlKCk7CisgICAgSHR0cFNlcnZsZXQgdGVzdFNlcnZsZXQgPSBuZXcgSHR0cFNlcnZsZXQoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHZpZXcuc2V0KFZpZXdGaWx0ZXIuZ2V0VmlldyhyZXEpKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgVmlld0ZpbHRlciB2ZiA9IG5ldyBWaWV3RmlsdGVyKAorICAgICAgICBuZXcgVGVzdEdpdGlsZXNBY2Nlc3MocmVwby5nZXRSZXBvc2l0b3J5KCkpLAorICAgICAgICBUZXN0R2l0aWxlc1VybHMuVVJMUywKKyAgICAgICAgbmV3IFZpc2liaWxpdHlDYWNoZShmYWxzZSkpOworICAgIE1ldGFGaWx0ZXIgbWYgPSBuZXcgTWV0YUZpbHRlcigpOworCisgICAgZm9yIChQYXR0ZXJuIHAgOiBJbW11dGFibGVMaXN0Lm9mKFJPT1RfUkVHRVgsIFJFUE9fUkVHRVgsIFJFUE9fUEFUSF9SRUdFWCkpIHsKKyAgICAgIG1mLnNlcnZlUmVnZXgocCkKKyAgICAgICAgICAudGhyb3VnaCh2ZikKKyAgICAgICAgICAud2l0aCh0ZXN0U2VydmxldCk7CisgICAgfQorCisgICAgRmFrZUh0dHBTZXJ2bGV0UmVxdWVzdCByZXEgPSBuZXdSZXF1ZXN0KHJlcG8uZ2V0UmVwb3NpdG9yeSgpKTsKKyAgICBpbnQgcSA9IHBhdGhBbmRRdWVyeS5pbmRleE9mKCc/Jyk7CisgICAgaWYgKHEgPiAwKSB7CisgICAgICByZXEuc2V0UGF0aEluZm8ocGF0aEFuZFF1ZXJ5LnN1YnN0cmluZygwLCBxKSk7CisgICAgICByZXEuc2V0UXVlcnlTdHJpbmcocGF0aEFuZFF1ZXJ5LnN1YnN0cmluZyhxICsgMSkpOworICAgIH0gZWxzZSB7CisgICAgICByZXEuc2V0UGF0aEluZm8ocGF0aEFuZFF1ZXJ5KTsKKyAgICB9CisgICAgbmV3IE1ldGFTZXJ2bGV0KG1mKXt9LnNlcnZpY2UocmVxLCBuZXcgRmFrZUh0dHBTZXJ2bGV0UmVzcG9uc2UoKSk7CisKKyAgICByZXR1cm4gdmlldy5nZXQoKTsKKyAgfQorfQo=