ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmRlYnVnLmNvcmUvcGx1Z2luLmphcnMgYi9vcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlL3BsdWdpbi5qYXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDgyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlL3BsdWdpbi5qYXJzCkBAIC0wLDAgKzEgQEAKK2R0Y29yZS5qYXI9RWNsaXBzZSBEZWJ1ZyBDb3JlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZGVidWcudWkvcGx1Z2luLmphcnMgYi9vcmcuZWNsaXBzZS5kZWJ1Zy51aS9wbHVnaW4uamFycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRiODBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZGVidWcudWkvcGx1Z2luLmphcnMKQEAgLTAsMCArMSBAQAorZHR1aS5qYXI9RWNsaXBzZSBEZWJ1ZyBVSQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmRlYnVnLnVpL3VpL29yZy9lY2xpcHNlL2RlYnVnL2ludGVybmFsL3VpL0RlYnVnVUlSZXNvdXJjZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmRlYnVnLnVpL3VpL29yZy9lY2xpcHNlL2RlYnVnL2ludGVybmFsL3VpL0RlYnVnVUlSZXNvdXJjZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY1MWZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZGVidWcudWkvdWkvb3JnL2VjbGlwc2UvZGVidWcvaW50ZXJuYWwvdWkvRGVidWdVSVJlc291cmNlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTI2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLgorIyBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTGF1bmNoZXIgcHJvcGVydHkgcGFnZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2xhdW5jaGVyX3ByZWZlcmVuY2VzLmRlc2NyaXB0aW9uPVNlbGVjdCBkZWZhdWx0IGxhdW5jaGVyCitsYXVuY2hlcl9wcmVmZXJlbmNlcy5ydW5fZGVidWc9UnVuL0RlYnVnCitsYXVuY2hlcl9wcmVmZXJlbmNlcy5ub25lPW5vbmUKK2xhdW5jaGVyX3ByZWZlcmVuY2VzLmNsb3NlZF9wcm9qZWN0PUxhdW5jaGVyIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIGEgY2xvc2VkIHByb2plY3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExhdW5jaCB3aXphcmQgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworbGF1bmNoX3dpemFyZC50aXRsZS5kZWJ1Zz1EZWJ1Zw0KK2xhdW5jaF93aXphcmQudGl0bGUucnVuPVJ1bgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMYXVuY2ggd2l6YXJkIHByb2plY3Qgc2VsZWN0aW9uIHBhZ2UKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsYXVuY2hfd2l6YXJkX3Byb2plY3RfcGFnZS50aXRsZT1TZWxlY3QgUHJvamVjdAorbGF1bmNoX3dpemFyZF9wcm9qZWN0X3BhZ2Uuc2VsZWN0X2VsZW1lbnQ9IFNlbGVjdCBhIHByb2plY3QgZm9yIHRoZSBsYXVuY2ggY29udGV4dC4KK2xhdW5jaF93aXphcmRfcHJvamVjdF9wYWdlLnNlbGVjdF9lcnJvcl9lbGVtZW50PU5vIHByb2plY3RzIGF2YWlsYWJsZS4KK2xhdW5jaF93aXphcmRfcHJvamVjdF9wYWdlLnBhdHRlcm5fbGFiZWw9RW50ZXIgYSBwYXR0ZXJuIHRvIHNlbGVjdCBhIHJhbmdlIG9mIHByb2plY3RzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExhdW5jaCB3aXphcmQgcGFnZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2xhdW5jaF93aXphcmRfcGFnZS50aXRsZT1TZWxlY3QgTGF1bmNoZXIKK2xhdW5jaF93aXphcmRfcGFnZS5sYXVuY2hlcj0gU2VsZWN0IGEgbGF1bmNoZXI6CitsYXVuY2hfd2l6YXJkX3BhZ2Uuc2VsZWN0X2Vycm9yX2xhdW5jaGVyPU5vIGxhdW5jaGVycyByZWdpc3RlcmVkLgorbGF1bmNoX3dpemFyZF9wYWdlLmRlZmF1bHRfbGF1bmNoZXI9U2V0IGFzICZkZWZhdWx0IGxhdW5jaGVyIGZvciBwcm9qZWN0IFwiezB9XCIKK2xhdW5jaF93aXphcmRfcGFnZS51bmtub3duPTx1bmtub3duPgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBY3Rpb24gcmVzb3VyY2VzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCithZGRfdG9faW5zcGVjdG9yX2FjdGlvbi50ZXh0PSZJbnNwZWN0CithZGRfdG9faW5zcGVjdG9yX2FjdGlvbi50b29sVGlwVGV4dD1BZGRzIFNlbGVjdGVkIFZhcmlhYmxlcyB0byBJbnNwZWN0b3IKKworY2hhbmdlX3ZhcmlhYmxlX3ZhbHVlX2FjdGlvbi50ZXh0PSZDaGFuZ2UgVmFyaWFibGUgVmFsdWUKK2NoYW5nZV92YXJpYWJsZV92YWx1ZV9hY3Rpb24uZGVzY3JpcHRpb249Q2hhbmdlcyB0aGUgdmFsdWUgb2YgYSBzaW1wbGUgdHlwZSB2YXJpYWJsZQorY2hhbmdlX3ZhcmlhYmxlX3ZhbHVlX2FjdGlvbi5kaWFsb2cubWVzc2FnZT1FbnRlciB0aGUgbmV3IHZhbHVlIGZvciB0aGUgdmFyaWFibGUgXCJ7MH1cIgorY2hhbmdlX3ZhcmlhYmxlX3ZhbHVlX2FjdGlvbi5kaWFsb2cuaW52YWxpZD1WYWx1ZSBpcyBub3QgdmFsaWQgZm9yIHRoZSB2YXJpYWJsZSBcInswfVwiCitjaGFuZ2VfdmFyaWFibGVfdmFsdWVfYWN0aW9uLmRpYWxvZy50aXRsZT1DaGFuZ2UgVmFyaWFibGUgVmFsdWUKKworY2xlYXJfb3V0cHV0X2FjdGlvbi50ZXh0PUNsZWFyICZPdXRwdXQKK2NsZWFyX291dHB1dF9hY3Rpb24udG9vbFRpcFRleHQ9Q2xlYXIgT3V0cHV0CisKK2NvcHlfYWN0aW9uLmxhYmVsPSZDb3B5QEN0cmwrQworY29weV9hY3Rpb24udG9vbHRpcD1Db3B5Citjb3B5X2FjdGlvbi5kZXNjcmlwdGlvbj1Db3B5CisKK2N1dF9hY3Rpb24ubGFiZWw9Q3UmdEBDdHJsK1gKK2N1dF9hY3Rpb24udG9vbHRpcD1DdXQKK2N1dF9hY3Rpb24uZGVzY3JpcHRpb249Q3V0CisKK2RlYnVnX2FjdGlvbi50ZXh0PSZEZWJ1Z0BGOQorZGVidWdfYWN0aW9uLnRvb2xUaXBUZXh0PURlYnVnCisKK2ZpbmRfcmVwbGFjZV9hY3Rpb24ubGFiZWw9JkZpbmQvUmVwbGFjZUBDdHJsK0YKK2ZpbmRfcmVwbGFjZV9hY3Rpb24udG9vbHRpcD1GaW5kL1JlcGxhY2UKK2ZpbmRfcmVwbGFjZV9hY3Rpb24uaW1hZ2U9CitmaW5kX3JlcGxhY2VfYWN0aW9uLmRlc2NyaXB0aW9uPUZpbmQvUmVwbGFjZQorCitnb3RvX2xpbmVfYWN0aW9uLmxhYmVsPUdvIHRvICZMaW5lLi4uQEN0cmwrTAorZ290b19saW5lX2FjdGlvbi50b29sdGlwPUdvIHRvIExpbmUKK2dvdG9fbGluZV9hY3Rpb24uaW1hZ2U9Citnb3RvX2xpbmVfYWN0aW9uLmRlc2NyaXB0aW9uPUdvIHRvIExpbmUKK2dvdG9fbGluZV9hY3Rpb24uZGlhbG9nLnRpdGxlPUdvIHRvIExpbmUKK2dvdG9fbGluZV9hY3Rpb24uZGlhbG9nLm1lc3NhZ2U9RW50ZXIgbGluZSBudW1iZXI6Citnb3RvX2xpbmVfYWN0aW9uLmRpYWxvZy5pbnZhbGlkX2lucHV0PU5vdCBhIG51bWJlcgorZ290b19saW5lX2FjdGlvbi5kaWFsb2cuaW52YWxpZF9yYW5nZT1MaW5lIG51bWJlciBvdXQgb2YgcmFuZ2UKKworbGF1bmNoX3dpdGhfYWN0aW9uLnRleHQuZGVidWc9RGVidWcKK2xhdW5jaF93aXRoX2FjdGlvbi50ZXh0LnJ1bj1SdW4KKworb3Blbl9icmVha3BvaW50X21hcmtlcl9hY3Rpb24udGV4dD0mR28gdG8gRmlsZQorb3Blbl9icmVha3BvaW50X21hcmtlcl9hY3Rpb24udG9vbFRpcFRleHQ9R28gdG8gRmlsZSBmb3IgQnJlYWtwb2ludAorCitwYXN0ZV9hY3Rpb24ubGFiZWw9JlBhc3RlQEN0cmwrVgorcGFzdGVfYWN0aW9uLnRvb2x0aXA9UGFzdGUKK3Bhc3RlX2FjdGlvbi5kZXNjcmlwdGlvbj1QYXN0ZXMgY2xpcGJvYXJkIHRleHQKKworcmVtb3ZlX2FsbF9icmVha3BvaW50c19hY3Rpb24udGV4dD1SZW1vdmUgJkFsbAorcmVtb3ZlX2FsbF9icmVha3BvaW50c19hY3Rpb24udG9vbFRpcFRleHQ9UmVtb3ZlIEFsbCBCcmVha3BvaW50cworCityZW1vdmVfYWxsX2Zyb21faW5zcGVjdG9yX2FjdGlvbi50ZXh0PVJlbW92ZSAmQWxsCityZW1vdmVfYWxsX2Zyb21faW5zcGVjdG9yX2FjdGlvbi50b29sVGlwVGV4dD1SZW1vdmUgQWxsIFZhcmlhYmxlcyBmcm9tIEluc3BlY3RvcgorCityZW1vdmVfYWxsX3Rlcm1pbmF0ZWRfYWN0aW9uLnRleHQ9UmVtb3ZlICZBbGwgVGVybWluYXRlZAorcmVtb3ZlX2FsbF90ZXJtaW5hdGVkX2FjdGlvbi50b29sVGlwVGV4dD1SZW1vdmUgQWxsIFRlcm1pbmF0ZWQgTGF1bmNoZXMKKworcmVtb3ZlX2JyZWFrcG9pbnRfYWN0aW9uLnRleHQ9JlJlbW92ZQorcmVtb3ZlX2JyZWFrcG9pbnRfYWN0aW9uLnRvb2xUaXBUZXh0PVJlbW92ZSBTZWxlY3RlZCBCcmVha3BvaW50cworCityZW1vdmVfZnJvbV9pbnNwZWN0b3JfYWN0aW9uLnRleHQ9JlJlbW92ZQorcmVtb3ZlX2Zyb21faW5zcGVjdG9yX2FjdGlvbi50b29sVGlwVGV4dD1SZW1vdmUgU2VsZWN0ZWQgVmFyaWFibGVzIGZyb20gSW5zcGVjdG9yCisKK3J1bl9hY3Rpb24udGV4dD1SJnVuQEFsdCtGOQorcnVuX2FjdGlvbi50b29sVGlwVGV4dD1SdW4KKworc2VsZWN0X2FsbF9hY3Rpb24ubGFiZWw9U2VsZWN0ICZBbGxAQ3RybCtBCitzZWxlY3RfYWxsX2FjdGlvbi50b29sdGlwPVNlbGVjdCBBbGwKK3NlbGVjdF9hbGxfYWN0aW9uLmRlc2NyaXB0aW9uPVNlbGVjdCBBbGwKKworc2hvd19xdWFsaWZpZWRfYWN0aW9uLnRvb2xUaXBUZXh0LnNob3c9U2hvdyAmUXVhbGlmaWVkIE5hbWVzCitzaG93X3F1YWxpZmllZF9hY3Rpb24udG9vbFRpcFRleHQuaGlkZT1IaWRlICZRdWFsaWZpZWQgTmFtZXMKKworc2hvd190eXBlc19hY3Rpb24udG9vbFRpcFRleHQuc2hvdz1TaG93ICZUeXBlIE5hbWVzCitzaG93X3R5cGVzX2FjdGlvbi50b29sVGlwVGV4dC5oaWRlPUhpZGUgJlR5cGUgTmFtZXMKKwordGVybWluYXRlX2FsbF9hY3Rpb24udGV4dD1UZXJtaSZuYXRlIEFsbAordGVybWluYXRlX2FsbF9hY3Rpb24udG9vbFRpcFRleHQ9VGVybWluYXRlIEFsbAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJyZWFrcG9pbnQgTGFiZWxzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYnJlYWtwb2ludF9sYWJlbC5saW5lX251bWJlcj1MaW5lOgorYnJlYWtwb2ludF9sYWJlbC51bmtub3duX2xpbmVfbnVtYmVyPTx1bmtub3duPgorYnJlYWtwb2ludF9sYWJlbC51bmtub3duX3Jlc291cmNlPUVSUk9SCiticmVha3BvaW50X2xhYmVsLmV4cGlyZWQ9PGV4cGlyZWQ+CiticmVha3BvaW50X2xhYmVsLmhpdF9jb3VudD08SGl0IENvdW50OiB7MH0+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5kZWJ1Zy51aS91aS9vcmcvZWNsaXBzZS9kZWJ1Zy9pbnRlcm5hbC91aS9EZWJ1Z1VJVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmRlYnVnLnVpL3VpL29yZy9lY2xpcHNlL2RlYnVnL2ludGVybmFsL3VpL0RlYnVnVUlVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjQxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5kZWJ1Zy51aS91aS9vcmcvZWNsaXBzZS9kZWJ1Zy9pbnRlcm5hbC91aS9EZWJ1Z1VJVXRpbHMuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpOw0KKw0KKy8qDQorICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKyAqLw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIHNlcnZlcyBhcyBhIGxvY2F0aW9uIGZvciB1dGlsaXR5IG1ldGhvZHMgZm9yIHRoZSBkZWJ1ZyBVSS4NCisgKi8NCitwdWJsaWMgY2xhc3MgRGVidWdVSVV0aWxzIHsNCisNCisJcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsNCisNCisJLyoqDQorCSAqIFV0aWxpdHkgbWV0aG9kIHdpdGggY29udmVudGlvbnMNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvckRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzKSB7DQorCQkvLyBpZiB0aGUgJ21lc3NhZ2UnIHJlc291cmNlIHN0cmluZyBhbmQgdGhlIElTdGF0dXMnIG1lc3NhZ2UgYXJlIHRoZSBzYW1lLA0KKwkJLy8gZG9uJ3Qgc2hvdyBib3RoIGluIHRoZSBkaWFsb2cNCisJCWlmIChzICE9IG51bGwgJiYgbWVzc2FnZS5lcXVhbHMocy5nZXRNZXNzYWdlKCkpKSB7DQorCQkJbWVzc2FnZT0gbnVsbDsNCisJCX0NCisJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBVdGlsaXR5IG1ldGhvZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgew0KKwkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgew0KKwkJCWZnUmVzb3VyY2VCdW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7DQorCQl9DQorCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBwYXJ0cyBvZiB0aGUgZGVidWcgdWkgcGFja2FnZS4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7DQorCQl0cnkgew0KKwkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLkRlYnVnVUlSZXNvdXJjZXMiKTsNCisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQorCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCAiRXJyb3IiLCBlLnRvU3RyaW5nKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBsb2cgaW50ZXJuYWwgVUkgZXJyb3JzDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoRXhjZXB0aW9uIGUpIHsNCisJCWlmIChEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpKSB7DQorCQkJLy8gdGhpcyBtZXNzYWdlIGlzIGludGVudGlvbmFsbHkgbm90IGludGVybmF0aW9uYWxpemVkLCBhcyBhbiBleGNlcHRpb24gbWF5DQorCQkJLy8gYmUgZHVlIHRvIHRoZSByZXNvdXJjZSBidW5kbGUgaXRzZWxmDQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcm5hbCBlcnJvciBsb2dnZWQgZnJvbSBVSTogIik7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsNCisJCX0NCisJfQ0KKwkNCisJLyoqDQorCSAqIERlZmluZWQgaGVyZSBhcyBhbiBBUEktbGVnYWwgd2F5IHRvIGdldCB0aGUgY29uc29sZSBkb2N1bWVudCBmb3IgdGhlIA0KKwkgKiBjdXJyZW50IHByb2Nlc3MuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElEb2N1bWVudCBnZXRDdXJyZW50Q29uc29sZURvY3VtZW50KCkgew0KKwkJRGVidWdVSVBsdWdpbiBwbHVnaW4gPSBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKTsNCisJCUlQcm9jZXNzIGN1cnJlbnRQcm9jZXNzID0gcGx1Z2luLmdldEN1cnJlbnRQcm9jZXNzKCk7DQorCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBwbHVnaW4uZ2V0Q29uc29sZURvY3VtZW50KGN1cnJlbnRQcm9jZXNzLCB0cnVlKTsNCisJCXJldHVybiBkb2N1bWVudDsNCisJfQ0KK30NCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjZWM5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvLmNsYXNzcGF0aApAQCAtMCwwICsxLDE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBCdWlsZGVyIi8+DQorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkV4dGVybmFsIFRvb2xzLyIvPg0KKyAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmFwYWNoZS54ZXJjZXMiLz4NCisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmFudC5jb3JlIi8+DQorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPg0KKyAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UudWkiLz4NCisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPg0KKyAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ib290Ii8+DQorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPg0KKyAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmFwYWNoZS5hbnQiLz4NCisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQorPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWRlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLy5jdnNpZ25vcmUKQEAgLTAsMCArMSw0IEBACitiaW4KK2V4dGVybmFsdG9vbHMuamFyLmJpbi5sb2cKK2V4dGVybmFsdG9vbHMuamFyCitidWlsZC54bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvLm9wdGlvbnMgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjcxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLy5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKyMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzIHBsdWdpbi4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjNkZWFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy8ucHJvamVjdApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHM8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPHByb2plY3RzPg0KKwkJPHByb2plY3Q+b3JnLmFwYWNoZS5hbnQ8L3Byb2plY3Q+DQorCQk8cHJvamVjdD5vcmcuYXBhY2hlLnhlcmNlczwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmFudC5jb3JlPC9wcm9qZWN0Pg0KKwkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0Pg0KKwkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+DQorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+DQorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4NCisJPC9wcm9qZWN0cz4NCisJPGJ1aWxkU3BlYz4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwk8L2J1aWxkU3BlYz4NCisJPG5hdHVyZXM+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCisJPC9uYXR1cmVzPg0KKzwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvQW50IEJ1aWxkZXIvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9hbnQvQW50QnVpbGRMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvQW50IEJ1aWxkZXIvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9hbnQvQW50QnVpbGRMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGVkMjdjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9BbnQgQnVpbGRlci9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL2FudC9BbnRCdWlsZExvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMTExIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWkuYW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3JwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK1RoaXMgZmlsZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aS5Mb2dDb25zb2xlRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aS5PdXRwdXRTdHJ1Y3R1cmVFbGVtZW50OworCitwdWJsaWMgY2xhc3MgQW50QnVpbGRMb2dnZXIgZXh0ZW5kcyBOdWxsQnVpbGRMb2dnZXIgeworCisJcHJpdmF0ZSBpbnQgZkxvZ0xlbmd0aCA9IDA7CisJcHJpdmF0ZSBpbnQgZkxhc3RUYXJnZXRFbmRJbmRleCA9IDA7CisJCisJcHVibGljIEFudEJ1aWxkTG9nZ2VyKCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJCWNyZWF0ZU5ld091dHB1dFN0cnVjdHVyZUVsZW1lbnQoZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpLCBmTG9nTGVuZ3RoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ29uc29sZVRyZWVzKCkgeworCQlmaW5hbCBMb2dDb25zb2xlRG9jdW1lbnQgZG9jID0gTG9nQ29uc29sZURvY3VtZW50LmdldEluc3RhbmNlKCk7CisJCWlmICghZG9jLmhhc1ZpZXdzKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQkvLyB3ZSBnZXQgdGhlIGRpc3BsYXkgZnJvbSB0aGUgY29uc29sZSAjMCAodGhhdCBleGlzdHMgZm9yIHN1cmUgYmVjYXVzZSBjb25zb2xlcyE9bnVsbCkKKwkJRGlzcGxheSBkaXNwbGF5ID0gZG9jLmdldERpc3BsYXkoKTsKKwkJLy8gY3JlYXRlIGEgbmV3IHRocmVhZCBmb3Igc3luY2hyb25pemluZyBhbGwgdGhlIHJlZnJlc2ggb3BlcmF0aW9ucworCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZG9jLnJlZnJlc2hUcmVlKCk7CisJCQl9CisJCX0pOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5ld091dHB1dFN0cnVjdHVyZUVsZW1lbnQoU3RyaW5nIG5hbWUsIGludCBpbmRleCkgeworCQlMb2dDb25zb2xlRG9jdW1lbnQgZG9jID0gTG9nQ29uc29sZURvY3VtZW50LmdldEluc3RhbmNlKCk7CisJCU91dHB1dFN0cnVjdHVyZUVsZW1lbnQgbmV3RWxlbWVudCA9CisJCQluZXcgT3V0cHV0U3RydWN0dXJlRWxlbWVudChuYW1lLCBkb2MuZ2V0Q3VycmVudE91dHB1dFN0cnVjdHVyZUVsZW1lbnQoKSwgaW5kZXgpOworCQlkb2Muc2V0Q3VycmVudE91dHB1dFN0cnVjdHVyZUVsZW1lbnQobmV3RWxlbWVudCk7CisJfQorCisJLyoqCisJICogQHNlZSBCdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworCQloYW5kbGVFeGNlcHRpb24oZXZlbnQpOworCQlmaW5pc2hDdXJyZW50T3V0cHV0U3RydWN0dXJlRWxlbWVudCgpOworCQkvLyBzdG9yZSB0aGUgZW5kIGluZGV4IG9mIHRoaXMgdGFyZ2V0J3MgbG9nIChzbyB0aGF0IHdlIGNhbiB1c2UgaXQgbGF0ZXIpCisJCWZMYXN0VGFyZ2V0RW5kSW5kZXggPSBmTG9nTGVuZ3RoOworCQlyZWZyZXNoQ29uc29sZVRyZWVzKCk7CisJfQorCisJLyoqCisJICogQHNlZSBCdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKEJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworCQljcmVhdGVOZXdPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50KGV2ZW50LmdldFRhc2soKS5nZXRUYXNrTmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKwkJaGFuZGxlRXhjZXB0aW9uKGV2ZW50KTsKKwkJZmluaXNoQ3VycmVudE91dHB1dFN0cnVjdHVyZUVsZW1lbnQoKTsKKwkJcmVmcmVzaENvbnNvbGVUcmVlcygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSkgeworCQlpZiAocHJpb3JpdHkgPiBnZXRNZXNzYWdlT3V0cHV0TGV2ZWwoKSkgeworCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmxvZ01lc3NhZ2UobWVzc2FnZSwgcHJpb3JpdHkpOworCQltZXNzYWdlICs9ICdcbic7CisJCUxvZ0NvbnNvbGVEb2N1bWVudCBkb2MgPSBMb2dDb25zb2xlRG9jdW1lbnQuZ2V0SW5zdGFuY2UoKTsKKwkJZG9jLmFwcGVuZChtZXNzYWdlLCBwcmlvcml0eSk7CisJCWZMb2dMZW5ndGggKz0gbWVzc2FnZS5sZW5ndGgoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hDdXJyZW50T3V0cHV0U3RydWN0dXJlRWxlbWVudCgpIHsKKwkJTG9nQ29uc29sZURvY3VtZW50IGRvYyA9IExvZ0NvbnNvbGVEb2N1bWVudC5nZXRJbnN0YW5jZSgpOworCQkvLyBzZXRzIHRoZSBpbmRleCB0aGF0IGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBsb2cgcGFydCBsaW5rZWQgdG8gdGhpcyBlbGVtZW50CisJCU91dHB1dFN0cnVjdHVyZUVsZW1lbnQgb3V0cHV0ID0gZG9jLmdldEN1cnJlbnRPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50KCk7CisJCW91dHB1dC5zZXRFbmRJbmRleChmTG9nTGVuZ3RoKTsKKwkJLy8gYW5kIHNldHMgdGhlIGN1cnJlbnQgZWxlbWVudCB0byB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50CisJCWRvYy5zZXRDdXJyZW50T3V0cHV0U3RydWN0dXJlRWxlbWVudChvdXRwdXQuZ2V0UGFyZW50KCkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5ld091dHB1dFN0cnVjdHVyZUVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKKwkJY3JlYXRlTmV3T3V0cHV0U3RydWN0dXJlRWxlbWVudChuYW1lLCBmTG9nTGVuZ3RoKTsKKwl9CisJCisJcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWlmIChtb25pdG9yID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQl9CisJCXJldHVybiBtb25pdG9yOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0FudCBCdWlsZGVyL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvYW50L0FudElucHV0SGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9BbnQgQnVpbGRlci9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL2FudC9BbnRJbnB1dEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzUzNTYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9BbnQgQnVpbGRlci9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL2FudC9BbnRJbnB1dEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWkuYW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3JwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK1RoaXMgZmlsZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLlRvb2xNZXNzYWdlczsKKworLyoqCisgKiBUaGUgZGVmYXVsdCBpbnB1dCBoYW5kbGVyIHdoZW4gdXNpbmcgQW50IHdpdGhpbiBFY2xpcHNlLgorICogVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB3aWxsIHJlc3BvbmQgdG8gPGlucHV0PiByZXF1ZXN0cyBmcm9tCisgKiB3aXRoaW4gYW4gQW50IGJ1aWxkIGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRJbnB1dEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SW5wdXRIYW5kbGVyIHsKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlciNoYW5kbGVJbnB1dChvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dFJlcXVlc3QpCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlSW5wdXQoSW5wdXRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCUJ1aWxkRXhjZXB0aW9uW10gcHJvYmxlbT0gbmV3IEJ1aWxkRXhjZXB0aW9uWzFdOworCQlSdW5uYWJsZSBydW5uYWJsZT0gZ2V0SGFuZGxlSW5wdXRSdW5uYWJsZShyZXF1ZXN0LCBwcm9ibGVtKTsKKwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocnVubmFibGUpOworCQlpZiAocHJvYmxlbVswXSAhPSBudWxsKSB7CisJCQl0aHJvdyBwcm9ibGVtWzBdOworCQl9CisJfQorCQorCXByb3RlY3RlZCBSdW5uYWJsZSBnZXRIYW5kbGVJbnB1dFJ1bm5hYmxlKGZpbmFsIElucHV0UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBCdWlsZEV4Y2VwdGlvbltdIHByb2JsZW0pIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTdHJpbmcgcHJvbXB0ID0gZ2V0UHJvbXB0KHJlcXVlc3QpOworCQkgICAgICAgCVN0cmluZyB0aXRsZT0gVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQW50SW5wdXRIYW5kbGVyLkFudF9JbnB1dF9SZXF1ZXN0XzEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCUlJbnB1dFZhbGlkYXRvciB2YWxpZGF0b3I9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7CisJCQkJCWludCBoaXRDb3VudD0gLTE7CisJCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgdmFsdWUpIHsKKwkJCQkJCXJlcXVlc3Quc2V0SW5wdXQodmFsdWUpOworCQkJCQkJaWYgKHJlcXVlc3QuaXNJbnB1dFZhbGlkKCkpIHsKKwkJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcmV0dXJuIFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkFudElucHV0SGFuZGxlci5JbnZhbGlkX2lucHV0XzIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQl9CisJCQkJfTsKKwkJCisJCQkJSW5wdXREaWFsb2cgZGlhbG9nPSBuZXcgSW5wdXREaWFsb2cobnVsbCwgdGl0bGUsIHByb21wdCwgIiIsIHZhbGlkYXRvcik7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBJbnB1dERpYWxvZy5PSykgeworCQkJCQlwcm9ibGVtWzBdPSBuZXcgQnVpbGRFeGNlcHRpb24oVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQW50SW5wdXRIYW5kbGVyLlVuYWJsZV9hYmxlX3RvX3Jlc3BvbmRfdG9fPGlucHV0Pl9yZXF1ZXN0XzQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9BbnQgQnVpbGRlci9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL2FudC9OdWxsQnVpbGRMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvQW50IEJ1aWxkZXIvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9hbnQvTnVsbEJ1aWxkTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhMmMwNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvQW50IEJ1aWxkZXIvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9hbnQvTnVsbEJ1aWxkTG9nZ2VyLmphdmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvQW50RmlsZVJ1bm5lci5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvQW50RmlsZVJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OTEwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9BbnRGaWxlUnVubmVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50UnVubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXNwb25zaWJsZSBmb3IgcnVubmluZyBhbnQgZmlsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRGaWxlUnVubmVyIGV4dGVuZHMgRXh0ZXJuYWxUb29sc1J1bm5lciB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9MT0dHRVJfQ0xBU1MgPSAib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aS5hbnQuQW50QnVpbGRMb2dnZXIiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfTE9HR0VSX0NMQVNTID0gIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWkuYW50Lk51bGxCdWlsZExvZ2dlciI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfSEFORExFUl9DTEFTUyA9ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpLmFudC5BbnRJbnB1dEhhbmRsZXIiOyAvLyROT04tTkxTLTEkCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRElSX1BSRUZJWCA9ICItRGJhc2VkaXI9IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ3JlYXRlcyBhbiBlbXB0eSBhbnQgZmlsZSBydW5uZXIKKwkgKi8KKwlwdWJsaWMgQW50RmlsZVJ1bm5lcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIGluIEV4dGVybmFsVG9vbHNSdW5uZXIuCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElSdW5uZXJDb250ZXh0IHJ1bm5lckNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlTdHJpbmdbXSB0YXJnZXRzID0gcnVubmVyQ29udGV4dC5nZXRBbnRUYXJnZXRzKCk7CisJCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOworCQkJU3RyaW5nIGFyZ3MgPSBydW5uZXJDb250ZXh0LmdldEV4cGFuZGVkQXJndW1lbnRzKCk7CisJCQlTdHJpbmcgYmFzZURpciA9IHJ1bm5lckNvbnRleHQuZ2V0RXhwYW5kZWRXb3JraW5nRGlyZWN0b3J5KCk7CisJCQlpZiAoYmFzZURpci5sZW5ndGgoKSA+IDApIHsKKwkJCQlTdHJpbmcgYmFzZURpckFyZzsKKwkJCQlpZiAoVG9vbFV0aWwuaGFzU3BhY2UoYmFzZURpcikpIHsKKwkJCQkJYmFzZURpckFyZyA9IEJBU0VfRElSX1BSRUZJWCArICJcIiIgKyBiYXNlRGlyICsgIlwiIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJYmFzZURpckFyZyA9IEJBU0VfRElSX1BSRUZJWCArIGJhc2VEaXI7CisJCQkJfQorCQkJCXJ1bm5lci5zZXRBcmd1bWVudHMoYXJncyArICIgIiArIGJhc2VEaXJBcmcgKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlydW5uZXIuc2V0QXJndW1lbnRzKGFyZ3MpOwkKKwkJCX0KKwkJCXJ1bm5lci5zZXRCdWlsZEZpbGVMb2NhdGlvbihydW5uZXJDb250ZXh0LmdldEV4cGFuZGVkTG9jYXRpb24oKSk7CisJCQlpZiAodGFyZ2V0cy5sZW5ndGggPiAwKSB7CisJCQkJcnVubmVyLnNldEV4ZWN1dGlvblRhcmdldHModGFyZ2V0cyk7CisJCQl9CisJCQlpZiAocnVubmVyQ29udGV4dC5nZXRTaG93TG9nKCkpIHsKKwkJCQlydW5uZXIuYWRkQnVpbGRMb2dnZXIoQU5UX0xPR0dFUl9DTEFTUyk7CisJCQl9IGVsc2UgeworCQkJCXJ1bm5lci5hZGRCdWlsZExvZ2dlcihOVUxMX0xPR0dFUl9DTEFTUyk7CisJCQl9CisJCQkKKwkJCXJ1bm5lci5zZXRJbnB1dEhhbmRsZXIoSU5QVVRfSEFORExFUl9DTEFTUyk7CisJCQkKKwkJCXJ1bm5lci5ydW4obW9uaXRvcik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVGhyb3dhYmxlIGNhcnJpZWRFeGNlcHRpb24gPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpOworCQkJaWYgKGNhcnJpZWRFeGNlcHRpb24gaW5zdGFuY2VvZiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbikgeworCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbihjYXJyaWVkRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisJCQl9IGVsc2UgeworCQkJCXRocm93IGU7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQltb25pdG9yLmRvbmUoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0FudFRhcmdldExpc3QuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0FudFRhcmdldExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjA1NTJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvQW50VGFyZ2V0TGlzdC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBsaXN0IG9mIHRhcmdldHMgdGhhdCBhbgorICogQW50IGZpbGUgY2FuIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIEFudFRhcmdldExpc3QgeworCS8vIFRoZSBsaXN0IG9mIHRhcmdldHMuCisJcHJpdmF0ZSBBcnJheUxpc3QgdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwkvLyBUaGUgdGFyZ2V0IHRoYXQgd2lsbCBiZSBydW4gaWYgbm8gdGFyZ2V0cyBhcmUgc3BlY2lmaWVkCisJLy8gYnkgdGhlIHVzZXIuCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRhcmdldCA9IG51bGw7CisJCisJLyoqCisJICogQWRkIGEgdGFyZ2V0IHRvIHRoZSBsaXN0LgorCSAqLworCS8qcGFja2FnZSovIHZvaWQgYWRkKFN0cmluZyB0YXJnZXQpIHsKKwkJdGFyZ2V0cy5hZGQodGFyZ2V0KTsJCisJfQorCQorCS8qKgorCSAqIFJldHJpZXZlIHRoZSBkZWZhdWx0IHRhcmdldC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGVmYXVsdCB0YXJnZXQgaGFzIG5vdCB5ZXQKKwkgKiBiZWVuIHNwZWNpZmllZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYXJnZXQoKSB7CisJCXJldHVybiBkZWZhdWx0VGFyZ2V0OwkKKwl9CisJCisJLyoqCisJICogUmV0cmlldmUgYWxsIHRoZSB0YXJnZXRzIGFzIGFuIGFycmF5LgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRUYXJnZXRzKCkgeworCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbdGFyZ2V0cy5zaXplKCldOworCQl0YXJnZXRzLnRvQXJyYXkoYXJyYXkpOworCQlyZXR1cm4gYXJyYXk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0YXJnZXRzIGluIHRoZSBsaXN0LgorCSAqLworCXB1YmxpYyBpbnQgZ2V0VGFyZ2V0Q291bnQoKSB7CisJCXJldHVybiB0YXJnZXRzLnNpemUoKTsKKwl9CisJCisJLyoqCisJICogU2V0IHRoZSBkZWZhdWx0IHRhcmdldC4KKwkgKi8KKwkvKnBhY2thZ2UqLyB2b2lkIHNldERlZmF1bHRUYXJnZXQoU3RyaW5nIHRhcmdldCkgeworCQlkZWZhdWx0VGFyZ2V0ID0gdGFyZ2V0OworCX0KKwkKKwkvKioKKwkgKiBWYWxpZGF0ZSB0aGUgZGVmYXVsdCB0YXJnZXQgZXhpc3RzIHdpdGhpbiB0aGUKKwkgKiBrbm93biB0YXJnZXQgbGlzdCBhbmQgaWYgbm90LCByZW1vdmUgaXQuCisJICovCisJLypwYWNrYWdlKi8gdm9pZCB2YWxpZGF0ZURlZmF1bHRUYXJnZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChkZWZhdWx0VGFyZ2V0ICE9IG51bGwpIHsKKwkJCWlmICh0YXJnZXRzLmNvbnRhaW5zKGRlZmF1bHRUYXJnZXQpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCVN0cmluZyBtc2c7CisJCWlmIChkZWZhdWx0VGFyZ2V0ICE9IG51bGwpIHsKKwkJCW1zZz0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkRlZmF1bHQgdGFyZ2V0IHswfXsxfXsyfSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHByb2plY3QuIiwgbmV3IFN0cmluZ1tdeyInIiwgZGVmYXVsdFRhcmdldCwgIicifSk7CisJCX0gZWxzZSB7CisJCQltc2c9ICJBIGRlZmF1bHQgdGFyZ2V0IG11c3QgZXhpc3QgaW4gdGhlIHByb2plY3QiOworCQl9CisJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFeHRlcm5hbFRvb2xzUGx1Z2luLlBMVUdJTl9JRCwgMCwgbXNnLCBudWxsKTsKKwkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9BbnRVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9BbnRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2ZmZkYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0FudFV0aWwuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorVGhpcyBmaWxlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5YTUxNZW1lbnRvOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKKy8qKgorICogR2VuZXJhbCB1dGlsaXR5IGNsYXNzIGRlYWxpbmcgd2l0aCBBbnQgZmlsZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFudFV0aWwgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy9OT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvL05PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RBUkdFVCA9ICJ0YXJnZXQiOyAvL05PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBObyBpbnN0YW5jZXMgYWxsb3dlZAorCSAqLworCXByaXZhdGUgQW50VXRpbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHRhcmdldHMgZm9yIHRoZSBBbnQgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIHByb3ZpZGVkCisJICogSVBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIEFudCB0YXJnZXRzIGZvdW5kLgorCSAqIAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmaWxlIGRvZXMgbm90IGV4aXN0LCBJTyBwcm9ibGVtcywgb3IgaW52YWxpZCBmb3JtYXQuCisJICovCisJcHVibGljIHN0YXRpYyBBbnRUYXJnZXRMaXN0IGdldFRhcmdldExpc3QoSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJTWVtZW50byBtZW1lbnRvID0gZ2V0TWVtZW50byhwYXRoKTsKKwkJcmV0dXJuIGdldFRhcmdldExpc3QobWVtZW50byk7CQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFuIElNZW1lbnRvIHJlcHJlc2VudGluZyB0aGUgQW50IGJ1aWxkZXIgZm91bmQgaW4KKwkgKiB0aGUgc3VwcGxpZWQgSVBhdGguCisJICogCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZpbGUgZG9lcyBub3QgZXhpc3QsIElPIHByb2JsZW1zLCBvciBpbnZhbGlkIGZvcm1hdC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJTWVtZW50byBnZXRNZW1lbnRvKElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCVJlYWRlciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihwYXRoLnRvRmlsZSgpKTsKKwkJCUlQYXRoIGJhc2VQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKKwkJCXJldHVybiBjcmVhdGVSZWFkUm9vdChyZWFkZXIsIGJhc2VQYXRoLnRvT1NTdHJpbmcoKSk7CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQlwcm9jZXNzRXhjZXB0aW9uKGUsICJBbnRVdGlsLmFudEZpbGVOb3RGb3VuZCIsIC0xKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQkvLyBXaWxsIG5ldmVyIGdldCBoZXJlIGFzIHByb2Nlc3NFeGNlcHRpb24gd2lsbCBhbHdheXMgdGhyb3cKKwkJLy8gYSBDb3JlIGV4Y2VwdGlvbi4uLmJ1dCBjb21waWxlciBkb2VzIG5vdCBrbm93IHRoYXQhCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gZnJvbSB0aGUgPGNvZGU+UmVhZGVyPC9jb2RlPgorCSAqIGFuZCByZXR1cm5zIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIHRoZSBkb2N1bWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWVudG8ncyBkb2N1bWVudAorCSAqIEBwYXJhbSBiYXNlRGlyIHRoZSBkaXJlY3RvcnkgdG8gdXNlIHRvIHJlc29sdmUgcmVsYXRpdmUgZmlsZSBuYW1lcworCSAqIAkJaW4gWE1MIGRvY3VtZW50LiBUaGlzIGRpcmVjdG9yeSBtdXN0IGV4aXN0IGFuZCBpbmNsdWRlIGEKKwkgKiAJCXRyYWlsaW5nIHNlcGFyYXRvci4gVGhlIGRpcmVjdG9yeSBmb3JtYXQsIGluY2x1ZGluZyB0aGUgc2VwYXJhdG9ycywKKwkgKiAJCW11c3QgYmUgdmFsaWQgZm9yIHRoZSBwbGF0Zm9ybS4KKwkgKiBAcmV0dXJuIHRoZSByb290IG1lbWVudG8gZm9yIHJlYWRpbmcgdGhlIGRvY3VtZW50CisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIElPIHByb2JsZW1zLCBvciBpbnZhbGlkIFhNTCBmb3JtYXQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChSZWFkZXIgcmVhZGVyLCBTdHJpbmcgYmFzZURpcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0cnkgeworCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisJCQlwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEFudEVudGl0eVJlc29sdmVyKGJhc2VEaXIpKTsKKwkJCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpOworCQkJc291cmNlLnNldFN5c3RlbUlkKGJhc2VEaXIpOworCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJzZXIucGFyc2Uoc291cmNlKTsKKwkJCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7CisJCQlmb3IoaW50IGk9MDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKKwkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKwkJCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCXByb2Nlc3NFeGNlcHRpb24oZSwgIkFudFV0aWwucGFyc2VyQ29uZmlnRXJyb3IiLCAtMSk7IC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJcHJvY2Vzc0V4Y2VwdGlvbihlLCAiQW50VXRpbC5pb0Vycm9yIiwgLTEpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCXByb2Nlc3NFeGNlcHRpb24oZSwgIkFudFV0aWwuZm9ybWF0RXJyb3IiLCBlLmdldExpbmVOdW1iZXIoKSk7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisJCQlwcm9jZXNzRXhjZXB0aW9uKGUsICJBbnRVdGlsLmZvcm1hdEVycm9yIiwgLTEpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJCisJCS8vIEludmFsaWQgYW50IGZpbGUKKwkJcHJvY2Vzc0V4Y2VwdGlvbihudWxsLCAiQW50VXRpbC5pbnZhbGlkQW50QnVpbGRGaWxlIiwgLTEpOyAvLyROT04tTkxTLTEkCisJCQorCQkvLyBXaWxsIG5ldmVyIGdldCBoZXJlIGFzIHByb2Nlc3NFeGNlcHRpb24gd2lsbCBhbHdheXMgdGhyb3cKKwkJLy8gYSBDb3JlIGV4Y2VwdGlvbi4uLmJ1dCBjb21waWxlciBkb2VzIG5vdCBrbm93IHRoYXQhCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGFyZ2V0cyBvZiB0aGUgQW50IGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhlCisJICogc3VwcGxpZWQgSU1lbWVudG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZW1lbnRvIGlzIG51bGwgb3IKKwkgKiBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBBbnQgZmlsZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBBbnRUYXJnZXRMaXN0IGdldFRhcmdldExpc3QoSU1lbWVudG8gbWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAobWVtZW50byA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCUFudFRhcmdldExpc3QgdGFyZ2V0cyA9IG5ldyBBbnRUYXJnZXRMaXN0KCk7CisJCQorCQlTdHJpbmcgZGVmYXVsdFRhcmdldCA9IG1lbWVudG8uZ2V0U3RyaW5nKEFUVF9ERUZBVUxUKTsKKwkJdGFyZ2V0cy5zZXREZWZhdWx0VGFyZ2V0KGRlZmF1bHRUYXJnZXQpOworCQkKKwkJSU1lbWVudG9bXSB0YXJnZXRNZW1lbnRvcyA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oVEFHX1RBUkdFVCk7CisJCWZvciAoaW50IGk9MDsgaSA8IHRhcmdldE1lbWVudG9zLmxlbmd0aDsgaSsrKSB7CisJCQlJTWVtZW50byB0YXJnZXRNZW1lbnRvID0gdGFyZ2V0TWVtZW50b3NbaV07CisJCQlTdHJpbmcgdGFyZ2V0ID0gdGFyZ2V0TWVtZW50by5nZXRTdHJpbmcoQVRUX05BTUUpOworCQkJaWYgKHRhcmdldCE9IG51bGwpCisJCQkJdGFyZ2V0cy5hZGQodGFyZ2V0KTsKKwkJfQorCQkKKwkJLy8gSWYgdGhlIGZpbGUgaGFzIG5vIHRhcmdldHMsIHRoZW4gaXQgaXMgbm90IGEKKwkJLy8gdmFsaWQgQW50IGZpbGUuCisJCWlmICh0YXJnZXRzLmdldFRhcmdldENvdW50KCkgPT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRzLnZhbGlkYXRlRGVmYXVsdFRhcmdldCgpOworCQkJcmV0dXJuIHRhcmdldHM7CisJCX0KKwl9CisJCisJLyoqCisJICogUHJvY2VzcyB0aGUgZXhjZXB0aW9uIGJ5IGNyZWF0aW5nIGEgd2VsbCBmb3JtYXR0ZWQKKwkgKiBJU3RhdHVzIGFuZCB0aHJvd2luZyBhIENvcmVFeGNlcHRpb24gd2l0aCBpdC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NFeGNlcHRpb24oRXhjZXB0aW9uIGUsIFN0cmluZyBtZXNzYWdlS2V5LCBpbnQgbGluZU51bWJlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlTdHJpbmdCdWZmZXIgcHJvYmxlbT0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkKKwkJaWYgKGxpbmVOdW1iZXIgPiAwKSB7CisJCQlwcm9ibGVtLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQXQgbGluZSBudW1iZXI6IHswfSIsIG5ldyBTdHJpbmdbXXtJbnRlZ2VyLnRvU3RyaW5nKGxpbmVOdW1iZXIpfSkpOworCQkJcHJvYmxlbS5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsgLy8kTk9OLU5MUy0xJDsKKwkJfQorCQlpZiAoZSAhPSBudWxsKSB7CisJCQlwcm9ibGVtLmFwcGVuZChlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJaWYgKHByb2JsZW0ubGVuZ3RoKCkgPT0gMCkgeworCQkJcHJvYmxlbS5hcHBlbmQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZyhtZXNzYWdlS2V5KSk7CisJCX0KKwkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEV4dGVybmFsVG9vbHNQbHVnaW4uUExVR0lOX0lELCAwLCBwcm9ibGVtLnRvU3RyaW5nKCksIGUpOworCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworCX0KKwkKKwkvKioKKwkgKiBFbnRpdHlSZXNvbHZlciB1c2VkIHdoZW4gcGFyc2luZyBBbnQgZmlsZXMgdG8gZmluZCB0YXJnZXRzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIEFudEVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgeworCQlwcml2YXRlIFN0cmluZyBiYXNlRGlyOworCQkKKwkJcHVibGljIEFudEVudGl0eVJlc29sdmVyKFN0cmluZyBiYXNlRGlyKSB7CisJCQl0aGlzLmJhc2VEaXIgPSBiYXNlRGlyOworCQl9CisJCQorCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkJaWYgKHN5c3RlbUlkID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCQorCQkJLy8gcmVtb3ZlICJmaWxlOiIgcHJlZml4CisJCQlpZiAoc3lzdGVtSWQuc3RhcnRzV2l0aCgiZmlsZToiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJLy8gNSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgImZpbGU6IgorCQkJCXN5c3RlbUlkID0gc3lzdGVtSWQuc3Vic3RyaW5nKDUpOworCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHN5c3RlbUlkKTsKKwkJCQkvLyBJZiB0aGUgZmlsZSBpcyBub3QgYWJzb2x1dGUsIHRoZSBzeXN0ZW1JZCBpcyByZWxhdGl2ZQorCQkJCS8vIHRvIHRoZSBiYXNlRGlyLgorCQkJCWlmICghZmlsZS5pc0Fic29sdXRlKCkpCisJCQkJCWZpbGUgPSBuZXcgRmlsZShiYXNlRGlyLCBzeXN0ZW1JZCk7CisJCQkJUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUpOworCQkJCXJldHVybiBuZXcgSW5wdXRTb3VyY2UocmVhZGVyKTsKKwkJCX0KKwkJCQorCQkJLy8gdXNlIGRlZmF1bHQgYmVoYXZpb3VyIGlmIHN5c3RlbUlkIGRvZXMgbm90IGhhdmUgImZpbGU6IiBwcmVmaXgKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvRGVmYXVsdFJ1bm5lckNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0RlZmF1bHRSdW5uZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0YmIwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0RlZmF1bHRSdW5uZXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSw0OTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworCisvKioKKyAqIENvbnRleHQgdG8gcnVuIHRoZSBleHRlcm5hbCB0b29sIGluLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGVmYXVsdFJ1bm5lckNvbnRleHQgaW1wbGVtZW50cyBJUnVubmVyQ29udGV4dCB7CisJcHJpdmF0ZSBFeHRlcm5hbFRvb2wgdG9vbDsKKwlwcml2YXRlIElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0OworCXByaXZhdGUgSVJlc291cmNlIHNlbGVjdGVkUmVzb3VyY2U7CisJcHJpdmF0ZSBJV29ya2luZ1NldE1hbmFnZXIgd29ya2luZ1NldE1hbmFnZXI7CisJcHJpdmF0ZSBBcnJheUxpc3QgYW50VGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwlwcml2YXRlIFN0cmluZyBleHBhbmRlZExvY2F0aW9uOworCXByaXZhdGUgU3RyaW5nIGV4cGFuZGVkQXJndW1lbnRzOworCXByaXZhdGUgU3RyaW5nIGV4cGFuZGVkRGlyZWN0b3J5OworCXByaXZhdGUgU3RyaW5nIGJ1aWxkVHlwZSA9IFRvb2xVdGlsLkJVSUxEX1RZUEVfTk9ORTsKKwkKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgY29udGV4dAorCSAqIAorCSAqIEBwYXJhbSB0b29sIHRoZSBleHRlcm5hbCB0b29sIGZvciB3aGljaCB0aGUgY29udGV4dCBhcHBsaWVzIHRvCisJICogQHBhcmFtIGN1cnJlbnRQcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHJ1biB0aGUgZXh0ZXJuYWwgdG9vbCBvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gbWFuYWdlciB0aGUgd29ya2luZyBzZXQgbWFuYWdlcgorCSAqLworCXB1YmxpYyBEZWZhdWx0UnVubmVyQ29udGV4dChFeHRlcm5hbFRvb2wgdG9vbCwgSVByb2plY3QgY3VycmVudFByb2plY3QsIElXb3JraW5nU2V0TWFuYWdlciBtYW5hZ2VyKSB7CisJCXRoaXModG9vbCwgY3VycmVudFByb2plY3QsIG51bGwsIG1hbmFnZXIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBjb250ZXh0CisJICogCisJICogQHBhcmFtIHRvb2wgdGhlIGV4dGVybmFsIHRvb2wgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGFwcGxpZXMgdG8KKwkgKiBAcGFyYW0gY3VycmVudFByb2plY3QgdGhlIHByb2plY3QgdG8gcnVuIHRoZSBleHRlcm5hbCB0b29sIG9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBzZWxlY3RlZFJlc291cmNlIHRoZSBzZWxlY3RlZCByZXNvdXJjZSB0byBydW4gdGhlIGV4dGVybmFsIHRvb2wgb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIG1hbmFnZXIgdGhlIHdvcmtpbmcgc2V0IG1hbmFnZXIKKwkgKi8KKwlwdWJsaWMgRGVmYXVsdFJ1bm5lckNvbnRleHQoRXh0ZXJuYWxUb29sIHRvb2wsIElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0LCBJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSwgSVdvcmtpbmdTZXRNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy50b29sID0gdG9vbDsKKwkJdGhpcy5jdXJyZW50UHJvamVjdCA9IGN1cnJlbnRQcm9qZWN0OworCQl0aGlzLnNlbGVjdGVkUmVzb3VyY2UgPSBzZWxlY3RlZFJlc291cmNlOworCQl0aGlzLndvcmtpbmdTZXRNYW5hZ2VyID0gbWFuYWdlcjsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElSdW5uZXJDb250ZXh0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRvb2wuZ2V0TmFtZSgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElSdW5uZXJDb250ZXh0LgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRBbnRUYXJnZXRzKCkgeworCQkvLyBSZXF1aXJlZCBiZWNhdXNlIGFudCB0YXJnZXQgdmFyaWFibGUgdGFncworCQkvLyBhcmUgZW1iZWRkZWQgaW4gdGhlIHRvb2wncyBhcmd1bWVudHMgYW5kCisJCS8vIG11c3QgYmUgZXhwYW5kZWQgYmVmb3JlaGFuZC4KKwkJZ2V0RXhwYW5kZWRBcmd1bWVudHMoKTsKKwkJCisJCVN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2FudFRhcmdldHMuc2l6ZSgpXTsJCisJCWFudFRhcmdldHMudG9BcnJheShyZXN1bHRzKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUnVubmVyQ29udGV4dC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEV4cGFuZGVkTG9jYXRpb24oKSB7CisJCWlmIChleHBhbmRlZExvY2F0aW9uID09IG51bGwpCisJCQlleHBhbmRlZExvY2F0aW9uID0gZXhwYW5kVmFyaWFibGVzKHRvb2wuZ2V0TG9jYXRpb24oKSwgZmFsc2UpOworCQlyZXR1cm4gZXhwYW5kZWRMb2NhdGlvbjsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElSdW5uZXJDb250ZXh0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kZWRBcmd1bWVudHMoKSB7CisJCWlmIChleHBhbmRlZEFyZ3VtZW50cyA9PSBudWxsKQorCQkJZXhwYW5kZWRBcmd1bWVudHMgPSBleHBhbmRWYXJpYWJsZXModG9vbC5nZXRBcmd1bWVudHMoKSwgdHJ1ZSk7CisJCXJldHVybiBleHBhbmRlZEFyZ3VtZW50czsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElSdW5uZXJDb250ZXh0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kZWRXb3JraW5nRGlyZWN0b3J5KCkgeworCQlpZiAoZXhwYW5kZWREaXJlY3RvcnkgPT0gbnVsbCkKKwkJCWV4cGFuZGVkRGlyZWN0b3J5ID0gZXhwYW5kVmFyaWFibGVzKHRvb2wuZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCBmYWxzZSk7CisJCXJldHVybiBleHBhbmRlZERpcmVjdG9yeTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZXhlY3V0aW9uIGxvZyBzaG91bGQgYXBwZWFyCisJICogb24gdGhlIGxvZyBjb25zb2xlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGdldFNob3dMb2coKSB7CisJCXJldHVybiB0b29sLmdldFNob3dMb2coKTsJCisJfQorCisJLyoqCisJICogRXhwYW5kcyB0aGUgdmFyaWFibGVzIGZvdW5kIGluIHRoZSB0ZXh0LgorCSAqLworCXByaXZhdGUgU3RyaW5nIGV4cGFuZFZhcmlhYmxlcyhTdHJpbmcgdGV4dCwgYm9vbGVhbiBhZGRRdW90ZXMpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCisJCWludCBzdGFydCA9IDA7CisJCXdoaWxlICh0cnVlKSB7CisJCQlUb29sVXRpbC5WYXJpYWJsZURlZmluaXRpb24gdmFyRGVmID0gVG9vbFV0aWwuZXh0cmFjdFZhcmlhYmxlVGFnKHRleHQsIHN0YXJ0KTsKKwkJCQorCQkJaWYgKHZhckRlZi5zdGFydCA9PSAtMSkgeworCQkJCWlmIChzdGFydCA9PSAwKQorCQkJCQlidWZmZXIuYXBwZW5kKHRleHQpOworCQkJCWVsc2UKKwkJCQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhzdGFydCkpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICh2YXJEZWYuc3RhcnQgPiBzdGFydCkgeworCQkJCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcoc3RhcnQsIHZhckRlZi5zdGFydCkpOworCQkJfQorCisJCQlpZiAodmFyRGVmLmVuZCA9PSAtMSkgeworCQkJCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcodmFyRGVmLnN0YXJ0KSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXN0YXJ0ID0gdmFyRGVmLmVuZDsKKwkJCX0KKworCQkJaWYgKHZhckRlZi5uYW1lICE9IG51bGwpCQkJCisJCQkJZXhwYW5kVmFyaWFibGUodmFyRGVmLCBidWZmZXIsIGFkZFF1b3Rlcyk7CisJCX0KKwkJCisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBFeHBhbmRzIHRoZSB2YXJpYWJsZQorCSAqLworCXByaXZhdGUgdm9pZCBleHBhbmRWYXJpYWJsZShUb29sVXRpbC5WYXJpYWJsZURlZmluaXRpb24gdmFyRGVmLCBTdHJpbmdCdWZmZXIgYnVmLCBib29sZWFuIGFkZFF1b3RlcykgeworCQlpZiAoRXh0ZXJuYWxUb29sLlZBUl9CVUlMRF9UWVBFLmVxdWFscyh2YXJEZWYubmFtZSkpIHsKKwkJCWFwcGVuZFZhcmlhYmxlKGJ1aWxkVHlwZSwgYnVmLCBhZGRRdW90ZXMpOwkKKwkJfQorCisJCWlmIChFeHRlcm5hbFRvb2wuVkFSX0FOVF9UQVJHRVQuZXF1YWxzKHZhckRlZi5uYW1lKSkgeworCQkJaWYgKHZhckRlZi5hcmd1bWVudCAhPSBudWxsICYmIHZhckRlZi5hcmd1bWVudC5sZW5ndGgoKSA+IDApCisJCQkJYW50VGFyZ2V0cy5hZGQodmFyRGVmLmFyZ3VtZW50KTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5WQVJfV09SS1NQQUNFX0xPQy5lcXVhbHModmFyRGVmLm5hbWUpKSB7CisJCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOworCQkJaWYgKHZhckRlZi5hcmd1bWVudCAhPSBudWxsICYmIHZhckRlZi5hcmd1bWVudC5sZW5ndGgoKSA+IDApCisJCQkJbG9jYXRpb24gPSBUb29sVXRpbC5nZXRMb2NhdGlvbkZyb21GdWxsUGF0aCh2YXJEZWYuYXJndW1lbnQpOworCQkJZWxzZQorCQkJCWxvY2F0aW9uID0gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7CisJCQlhcHBlbmRWYXJpYWJsZShsb2NhdGlvbiwgYnVmLCBhZGRRdW90ZXMpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoRXh0ZXJuYWxUb29sLlZBUl9QUk9KRUNUX0xPQy5lcXVhbHModmFyRGVmLm5hbWUpKSB7CisJCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOworCQkJaWYgKHZhckRlZi5hcmd1bWVudCAhPSBudWxsICYmIHZhckRlZi5hcmd1bWVudC5sZW5ndGgoKSA+IDApIHsKKwkJCQlJUmVzb3VyY2UgbWVtYmVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHZhckRlZi5hcmd1bWVudCk7CisJCQkJaWYgKG1lbWJlciAhPSBudWxsKQorCQkJCQlsb2NhdGlvbiA9IG1lbWJlci5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjdXJyZW50UHJvamVjdCAhPSBudWxsKQorCQkJCQlsb2NhdGlvbiA9IGN1cnJlbnRQcm9qZWN0LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOworCQkJfQorCQkJYXBwZW5kVmFyaWFibGUobG9jYXRpb24sIGJ1ZiwgYWRkUXVvdGVzKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5WQVJfUkVTT1VSQ0VfTE9DLmVxdWFscyh2YXJEZWYubmFtZSkpIHsKKwkJCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7CisJCQlpZiAodmFyRGVmLmFyZ3VtZW50ICE9IG51bGwgJiYgdmFyRGVmLmFyZ3VtZW50Lmxlbmd0aCgpID4gMCkgeworCQkJCWxvY2F0aW9uID0gVG9vbFV0aWwuZ2V0TG9jYXRpb25Gcm9tRnVsbFBhdGgodmFyRGVmLmFyZ3VtZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UgIT0gbnVsbCkKKwkJCQkJbG9jYXRpb24gPSBzZWxlY3RlZFJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOworCQkJfQorCQkJYXBwZW5kVmFyaWFibGUobG9jYXRpb24sIGJ1ZiwgYWRkUXVvdGVzKTsKKwkJCXJldHVybjsJCQkKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5WQVJfQ09OVEFJTkVSX0xPQy5lcXVhbHModmFyRGVmLm5hbWUpKSB7CisJCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOworCQkJaWYgKHZhckRlZi5hcmd1bWVudCAhPSBudWxsICYmIHZhckRlZi5hcmd1bWVudC5sZW5ndGgoKSA+IDApIHsKKwkJCQlJUmVzb3VyY2UgbWVtYmVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHZhckRlZi5hcmd1bWVudCk7CisJCQkJaWYgKG1lbWJlciAhPSBudWxsKQorCQkJCQlsb2NhdGlvbiA9IG1lbWJlci5nZXRQYXJlbnQoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UgIT0gbnVsbCkKKwkJCQkJbG9jYXRpb24gPSBzZWxlY3RlZFJlc291cmNlLmdldFBhcmVudCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOworCQkJfQorCQkJYXBwZW5kVmFyaWFibGUobG9jYXRpb24sIGJ1ZiwgYWRkUXVvdGVzKTsKKwkJCXJldHVybjsJCQkKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5WQVJfUFJPSkVDVF9QQVRILmVxdWFscyh2YXJEZWYubmFtZSkpIHsKKwkJCVN0cmluZyBmdWxsUGF0aCA9IG51bGw7CisJCQlpZiAodmFyRGVmLmFyZ3VtZW50ICE9IG51bGwgJiYgdmFyRGVmLmFyZ3VtZW50Lmxlbmd0aCgpID4gMCkgeworCQkJCUlSZXNvdXJjZSBtZW1iZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIodmFyRGVmLmFyZ3VtZW50KTsKKwkJCQlpZiAobWVtYmVyICE9IG51bGwpCisJCQkJCWZ1bGxQYXRoID0gbWVtYmVyLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjdXJyZW50UHJvamVjdCAhPSBudWxsKQorCQkJCQlmdWxsUGF0aCA9IGN1cnJlbnRQcm9qZWN0LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKKwkJCX0KKwkJCWFwcGVuZFZhcmlhYmxlKGZ1bGxQYXRoLCBidWYsIGFkZFF1b3Rlcyk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmIChFeHRlcm5hbFRvb2wuVkFSX1JFU09VUkNFX1BBVEguZXF1YWxzKHZhckRlZi5uYW1lKSkgeworCQkJU3RyaW5nIGZ1bGxQYXRoID0gbnVsbDsKKwkJCWlmICh2YXJEZWYuYXJndW1lbnQgIT0gbnVsbCAmJiB2YXJEZWYuYXJndW1lbnQubGVuZ3RoKCkgPiAwKSB7CisJCQkJSVJlc291cmNlIG1lbWJlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih2YXJEZWYuYXJndW1lbnQpOworCQkJCWlmIChtZW1iZXIgIT0gbnVsbCkKKwkJCQkJZnVsbFBhdGggPSBtZW1iZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSAhPSBudWxsKQorCQkJCQlmdWxsUGF0aCA9IHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOworCQkJfQorCQkJYXBwZW5kVmFyaWFibGUoZnVsbFBhdGgsIGJ1ZiwgYWRkUXVvdGVzKTsKKwkJCXJldHVybjsJCQkKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5WQVJfQ09OVEFJTkVSX1BBVEguZXF1YWxzKHZhckRlZi5uYW1lKSkgeworCQkJU3RyaW5nIGZ1bGxQYXRoID0gbnVsbDsKKwkJCWlmICh2YXJEZWYuYXJndW1lbnQgIT0gbnVsbCAmJiB2YXJEZWYuYXJndW1lbnQubGVuZ3RoKCkgPiAwKSB7CisJCQkJSVJlc291cmNlIG1lbWJlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih2YXJEZWYuYXJndW1lbnQpOworCQkJCWlmIChtZW1iZXIgIT0gbnVsbCkKKwkJCQkJZnVsbFBhdGggPSBtZW1iZXIuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSAhPSBudWxsKQorCQkJCQlmdWxsUGF0aCA9IHNlbGVjdGVkUmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOworCQkJfQorCQkJYXBwZW5kVmFyaWFibGUoZnVsbFBhdGgsIGJ1ZiwgYWRkUXVvdGVzKTsKKwkJCXJldHVybjsJCQkKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5WQVJfUFJPSkVDVF9OQU1FLmVxdWFscyh2YXJEZWYubmFtZSkpIHsKKwkJCVN0cmluZyBuYW1lID0gbnVsbDsKKwkJCWlmICh2YXJEZWYuYXJndW1lbnQgIT0gbnVsbCAmJiB2YXJEZWYuYXJndW1lbnQubGVuZ3RoKCkgPiAwKSB7CisJCQkJSVJlc291cmNlIG1lbWJlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih2YXJEZWYuYXJndW1lbnQpOworCQkJCWlmIChtZW1iZXIgIT0gbnVsbCkKKwkJCQkJbmFtZSA9IG1lbWJlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY3VycmVudFByb2plY3QgIT0gbnVsbCkKKwkJCQkJbmFtZSA9IGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKTsKKwkJCX0KKwkJCWFwcGVuZFZhcmlhYmxlKG5hbWUsIGJ1ZiwgYWRkUXVvdGVzKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5WQVJfUkVTT1VSQ0VfTkFNRS5lcXVhbHModmFyRGVmLm5hbWUpKSB7CisJCQlTdHJpbmcgbmFtZSA9IG51bGw7CisJCQlpZiAodmFyRGVmLmFyZ3VtZW50ICE9IG51bGwgJiYgdmFyRGVmLmFyZ3VtZW50Lmxlbmd0aCgpID4gMCkgeworCQkJCUlSZXNvdXJjZSBtZW1iZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIodmFyRGVmLmFyZ3VtZW50KTsKKwkJCQlpZiAobWVtYmVyICE9IG51bGwpCisJCQkJCW5hbWUgPSBtZW1iZXIuZ2V0TmFtZSgpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSAhPSBudWxsKQorCQkJCQluYW1lID0gc2VsZWN0ZWRSZXNvdXJjZS5nZXROYW1lKCk7CisJCQl9CisJCQlhcHBlbmRWYXJpYWJsZShuYW1lLCBidWYsIGFkZFF1b3Rlcyk7CisJCQlyZXR1cm47CQkJCisJCX0KKwkJCisJCWlmIChFeHRlcm5hbFRvb2wuVkFSX0NPTlRBSU5FUl9OQU1FLmVxdWFscyh2YXJEZWYubmFtZSkpIHsKKwkJCVN0cmluZyBuYW1lID0gbnVsbDsKKwkJCWlmICh2YXJEZWYuYXJndW1lbnQgIT0gbnVsbCAmJiB2YXJEZWYuYXJndW1lbnQubGVuZ3RoKCkgPiAwKSB7CisJCQkJSVJlc291cmNlIG1lbWJlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih2YXJEZWYuYXJndW1lbnQpOworCQkJCWlmIChtZW1iZXIgIT0gbnVsbCkKKwkJCQkJbmFtZSA9IG1lbWJlci5nZXRQYXJlbnQoKS5nZXROYW1lKCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChzZWxlY3RlZFJlc291cmNlICE9IG51bGwpCisJCQkJCW5hbWUgPSBzZWxlY3RlZFJlc291cmNlLmdldFBhcmVudCgpLmdldE5hbWUoKTsKKwkJCX0KKwkJCWFwcGVuZFZhcmlhYmxlKG5hbWUsIGJ1ZiwgYWRkUXVvdGVzKTsKKwkJCXJldHVybjsJCQkKKwkJfQorCX0KKworCS8qKgorCSAqIEhlbHBlciBtZXRob2QgdG8gYWRkIHRoZSBnaXZlbiB2YXJpYWJsZSBzdHJpbmcgdG8gdGhlIGdpdmVuCisJICogc3RyaW5nIGJ1ZmZlciBpZiB0aGUgc3RyaW5nIGlzIG5vdCBudWxsLiBBZGRzIGVuY2xvc2luZyBxdW90YXRpb24KKwkgKiBtYXJrcyBpZiBhZGRRdW90ZXMgaXMgdHJ1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gdmFyIHRoZSB2YXJpYWJsZSBzdHJpbmcgdG8gYmUgYWRkZWQKKwkgKiBAcGFyYW0gYnVmIHRoZSBzdHJpbmcgYnVmZmVyIHRvIHdoaWNoIHRoZSBzdHJpbmcgd2lsbCBiZSBhZGRlZAorCSAqIEBwYXJtYW4gYWRkUXVvdGVzIHdoZXRoZXIgb3Igbm90IHRvIGFkZCBlbmNsb3NpbmcgcXVvdGF0aW9uIG1hcmtzCisJICovCisJcHJpdmF0ZSB2b2lkIGFwcGVuZFZhcmlhYmxlKFN0cmluZyB2YXIsIFN0cmluZ0J1ZmZlciBidWYsIGJvb2xlYW4gYWRkUXVvdGVzKSB7CisJCWlmICh2YXIgIT0gbnVsbCkgeworCQkJaWYgKGFkZFF1b3RlcyAmJiBUb29sVXRpbC5oYXNTcGFjZSh2YXIpKQorCQkJCWJ1Zi5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1Zi5hcHBlbmQodmFyKTsKKwkJCWlmIChhZGRRdW90ZXMgJiYgVG9vbFV0aWwuaGFzU3BhY2UodmFyKSkKKwkJCQlidWYuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkCQkJCisJCX0KKwl9CisJCisJLyoqCisJICogRXhlY3V0ZXMgdGhlIHJ1bm5lciB0byBsYXVuY2ggdGhlIGV4dGVybmFsIHRvb2wuIEEgcmVzb3VyY2UgcmVmcmVzaAorCSAqIGlzIGRvbmUgaWYgc3BlY2lmaWVkLgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcyB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHJpdmF0ZSB2b2lkIGV4ZWN1dGVSdW5uZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCXRyeSB7CisJCQlUb29sVXRpbC5WYXJpYWJsZURlZmluaXRpb24gc2NvcGUgPSBUb29sVXRpbC5leHRyYWN0VmFyaWFibGVUYWcodG9vbC5nZXRSZWZyZXNoU2NvcGUoKSwgMCk7CisJCQlFeHRlcm5hbFRvb2xzUnVubmVyIHJ1bm5lciA9IFRvb2xVdGlsLmdldFJ1bm5lcih0b29sLmdldFR5cGUoKSk7CisJCQlpZiAocnVubmVyICE9IG51bGwpIHsKKwkJCQlpZiAoc2NvcGUubmFtZSA9PSBudWxsIHx8IEV4dGVybmFsVG9vbC5SRUZSRVNIX1NDT1BFX05PTkUuZXF1YWxzKHNjb3BlLm5hbWUpKSB7CisJCQkJCXJ1bm5lci5leGVjdXRlKG1vbml0b3IsIHRoaXMpOworCQkJCX0gZWxzZSB7CisJCQkJCW1vbml0b3IuYmVnaW5UYXNrKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkRlZmF1bHRSdW5uZXJDb250ZXh0LnJ1bm5pbmdFeHRlcm5hbFRvb2wiKSwgMTAwKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlydW5uZXIuZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDcwKSwgdGhpcyk7CisJCQkJCXJlZnJlc2hSZXNvdXJjZXMobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAzMCksIHNjb3BlLm5hbWUsIHNjb3BlLmFyZ3VtZW50KTsKKwkJCQl9CisJCQl9CisJCX0gZmluYWxseSB7CisJCQltb25pdG9yLmRvbmUoKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSdW5zIHRoZSBleHRlcm5hbCB0b29sIGFuZCBkb2VzIGEgcmVzb3VyY2UgcmVmcmVzaCBpZiBzcGVjaWZpZWQuCisJICogVGhlIHRvb2wgaXMgdmFsaWRhdGVkIHdpdGhpbiB0aGlzIGNvbnRleHQgYmVmb3JlIGJlaW5nCisJICogcnVubmVkLiBBbnkgcHJvYmxlbXMgd2lsbCBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duLgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcyB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHByb2JsZW0gPSB2YWxpZGF0ZUluQ29udGV4dCgpOworCQlpZiAocHJvYmxlbSAhPSBudWxsKSB7CisJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBFeHRlcm5hbFRvb2xzUGx1Z2luLlBMVUdJTl9JRCwgMCwgcHJvYmxlbSwgbnVsbCk7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworCQl9CisJCQorCQlleGVjdXRlUnVubmVyKG1vbml0b3IpOworCX0KKworCS8qKgorCSAqIFJ1bnMgdGhlIGV4dGVybmFsIHRvb2wgYW5kIGRvZXMgYSByZXNvdXJjZSByZWZyZXNoIGlmIHNwZWNpZmllZC4KKwkgKiBUaGUgdG9vbCBpcyB2YWxpZGF0ZWQgd2l0aGluIHRoaXMgY29udGV4dCBiZWZvcmUgYmVpbmcKKwkgKiBydW5uZWQuIEFueSBwcm9ibGVtcyBhcmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGluIGEgZGlhbG9nIGJveC4KKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0byByZXBvcnQgcHJvZ3Jlc3MgdG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgdG8gcGFyZW50IHRoZSBlcnJvciBtZXNzYWdlIGRpYWxvZworCSAqLworCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIFNoZWxsIHNoZWxsKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQl0cnkgeworCQkJZmluYWwgU3RyaW5nIHByb2JsZW0gPSB2YWxpZGF0ZUluQ29udGV4dCgpOworCQkJaWYgKHByb2JsZW0gIT0gbnVsbCkgeworCQkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7IAorCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcigKKwkJCQkJCQlzaGVsbCwgCisJCQkJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRGVmYXVsdFJ1bm5lckNvbnRleHQuZXJyb3JTaGVsbFRpdGxlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlwcm9ibGVtKTsKKwkJCQkJfQorCQkJCX0pOworCQkJfSBlbHNlIHsKKwkJCQlleGVjdXRlUnVubmVyKG1vbml0b3IpOworCQkJfQorCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7IAorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAorCQkJCQkJc2hlbGwsCisJCQkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJEZWZhdWx0UnVubmVyQ29udGV4dC5lcnJvclNoZWxsVGl0bGUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRGVmYXVsdFJ1bm5lckNvbnRleHQuZXJyb3JNZXNzYWdlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCWUuZ2V0U3RhdHVzKCkpOworCQkJCX0KKwkJCX0pOworCQl9CisJfQorCisJLyoqCisJICogQ2F1c2VzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VzIHRvIGJlIHJlZnJlc2hlZC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVmcmVzaFJlc291cmNlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBzY29wZSwgU3RyaW5nIGFyZ3VtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChFeHRlcm5hbFRvb2wuUkVGUkVTSF9TQ09QRV9XT1JLU1BBQ0UuZXF1YWxzKHNjb3BlKSkgeworCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5SRUZSRVNIX1NDT1BFX1BST0pFQ1QuZXF1YWxzKHNjb3BlKSkgeworCQkJSVByb2plY3QgY29udGFpbmVyID0gbnVsbDsKKwkJCWlmIChhcmd1bWVudCA9PSBudWxsKSB7CisJCQkJY29udGFpbmVyID0gY3VycmVudFByb2plY3Q7CisJCQl9IGVsc2UgeworCQkJCWNvbnRhaW5lciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChhcmd1bWVudCk7CisJCQl9CisJCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmlzQWNjZXNzaWJsZSgpKQorCQkJCWNvbnRhaW5lci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKEV4dGVybmFsVG9vbC5SRUZSRVNIX1NDT1BFX1dPUktJTkdfU0VULmVxdWFscyhzY29wZSkpIHsKKwkJCWlmIChhcmd1bWVudCA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCUlXb3JraW5nU2V0IHNldCA9IHdvcmtpbmdTZXRNYW5hZ2VyLmdldFdvcmtpbmdTZXQoYXJndW1lbnQpOworCQkJaWYgKHNldCA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCXRyeSB7CisJCQkJSUFkYXB0YWJsZVtdIGVsZW1lbnRzID0gc2V0LmdldEVsZW1lbnRzKCk7CisJCQkJbW9uaXRvci5iZWdpblRhc2soCisJCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkRlZmF1bHRSdW5uZXJDb250ZXh0LnJlZnJlc2hXb3JraW5nU2V0IiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJZWxlbWVudHMubGVuZ3RoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCUlBZGFwdGFibGUgYWRhcHRhYmxlID0gZWxlbWVudHNbaV07CisJCQkJCUlSZXNvdXJjZSByZXNvdXJjZTsKKwkJCQkJCisJCQkJCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCisJCQkJCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGFkYXB0YWJsZTsKKwkJCQkJZWxzZQorCQkJCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOworCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKKwkJCQkJCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOworCisJCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJCX0KKwkJCX0KKwkJCWZpbmFsbHkgeworCQkJCW1vbml0b3IuZG9uZSgpOworCQkJfQorCQkJCisJCQlyZXR1cm47CisJCX0KKwl9CisJCisJLyoqCisJICogVmFsaWRhdGVzIHRoZSBleHRlcm5hbCB0b29sIHRvIGVuc3VyZSB0aGUgZXh0ZXJuYWwgdG9vbCBsb2NhdGlvbiBhbmQKKwkgKiB3b3JraW5nIGRpcmVjdG9yeSBleGlzdCBpbiB0aGUgZmlsZSBzeXN0ZW0uCisJICogCisJICogQHJldHVybiB0aGUgcHJvYmxlbSB0ZXh0IGlzIHZhbGlkYXRlIGZhaWxzLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIAkJaWYgYWxsIHNlZW1zIHZhbGlkLgorCSAqLworCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRlSW5Db250ZXh0KCkgeworCQlTdHJpbmcgbG9jID0gZ2V0RXhwYW5kZWRMb2NhdGlvbigpOworCQlpZiAobG9jID09IG51bGwgfHwgbG9jLmxlbmd0aCgpID09IDApCisJCQlyZXR1cm4gVG9vbE1lc3NhZ2VzLmZvcm1hdCgiRGVmYXVsdFJ1bm5lckNvbnRleHQuaW52YWxpZExvY2F0aW9uIiwgbmV3IE9iamVjdFtdIHt0b29sLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkCisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvYyk7CisJCWlmICghZmlsZS5pc0ZpbGUoKSkKKwkJCXJldHVybiAgVG9vbE1lc3NhZ2VzLmZvcm1hdCgiRGVmYXVsdFJ1bm5lckNvbnRleHQuaW52YWxpZExvY2F0aW9uIiwgbmV3IE9iamVjdFtdIHt0b29sLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkCisJCQorCQlTdHJpbmcgZGlyID0gZ2V0RXhwYW5kZWRXb3JraW5nRGlyZWN0b3J5KCk7CisJCWlmIChkaXIgIT0gbnVsbCAmJiBkaXIubGVuZ3RoKCkgPiAwKSB7CisJCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkaXIpOworCQkJaWYgKCFwYXRoLmlzRGlyZWN0b3J5KCkpCisJCQkJcmV0dXJuIFRvb2xNZXNzYWdlcy5mb3JtYXQoIkRlZmF1bHRSdW5uZXJDb250ZXh0LmludmFsaWREaXJlY3RvcnkiLCBuZXcgT2JqZWN0W10ge3Rvb2wuZ2V0TmFtZSgpfSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFNldCB0aGUgYnVpbGQgdHlwZSBmb3IgdGhpcyBydW5uZXIgY29udGV4dC4gVGhlIGJ1aWxkIHR5cGUgaXMgdGhlIHR5cGUgCisJICogb2YgYnVpbGQgKG9uZSBvZiBUb29sVXRpbC5CVUlMRF9UWVBFX0lOQ1JFTUVOVEFMLCBUb29sVXRpbC5CVUlMRF9UWVBFX0FVVE8sCisJICogb3IgVG9vbFV0aWwuQlVJTERfVFlQRV9GVUxMKSBpZiB0aGUgdG9vbCBiZWluZyBydW4gaXMgcnVubmluZyBhcyBhIHByb2plY3QKKwkgKiBidWlsZGVyLCBvciBUb29sVXRpbC5CVUlMRF9UWVBFX05PTkUgb3RoZXJ3aXNlLgorCSAqLworCS8qcGFja2FnZSovIHZvaWQgc2V0QnVpbGRUeXBlKGludCBraW5kKSB7CisJCWlmIChraW5kID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpCisJCQlidWlsZFR5cGUgPSBUb29sVXRpbC5CVUlMRF9UWVBFX0lOQ1JFTUVOVEFMOworCQllbHNlIGlmIChraW5kID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCkKKwkJCWJ1aWxkVHlwZSA9IFRvb2xVdGlsLkJVSUxEX1RZUEVfRlVMTDsKKwkJZWxzZSBpZiAoa2luZCA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkFVVE9fQlVJTEQpCisJCQlidWlsZFR5cGUgPSBUb29sVXRpbC5CVUlMRF9UWVBFX0FVVE87CisJCWVsc2UgCisJCQlidWlsZFR5cGUgPSBUb29sVXRpbC5CVUlMRF9UWVBFX05PTkU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvRXh0ZXJuYWxUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjMzE1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbC5qYXZhCkBAIC0wLDAgKzEsMjk4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4dGVybmFsIHRvb2wgdGhhdCBjYW4gYmUgcnVuLiBUaGUgdG9vbAorICogY2FuIGJlIGluc2lkZSBvciBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UuCisgKiA8cD4KKyAqIEFuIGV4dGVybmFsIHRvb2wgY29uc2lzdCBvZiBhIHVzZXIgZGVmaW5lZCBuYW1lLCBhIHBhdGggdG8gdGhlIGxvY2F0aW9uCisgKiBvZiB0aGUgZmlsZSwgb3B0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgZmlsZSwgYW5kIHRoZSB3b3JraW5nCisgKiBkaXJlY3RvcnkuCisgKiA8L3A+PHA+CisgKiBBZnRlciB0aGUgdG9vbCBoYXMgcnVuLCBwYXJ0IG9yIGFsbCBvZiB0aGUgd29ya3NwYWNlIGNhbiBiZQorICogcmVmcmVzaGVkIHRvIHBpY2t1cCBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRvb2wuIFRoaXMgaXMgb3B0aW9uYWwKKyAqIGFuZCBkb2VzIG5vdGhpbmcgYnkgZGVmYXVsdAorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxUb29sIHsKKwkvLyBJbnRlcm5hbCB0YWdzIGZvciBzdG9yaW5nIHRvb2wgcmVsYXRlZCBpbmZvcm1hdGlvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9UWVBFID0gIiF7dG9vbF90eXBlfSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RPT0xfTkFNRSA9ICIhe3Rvb2xfbmFtZX0iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UT09MX0xPQ0FUSU9OID0gIiF7dG9vbF9sb2N9IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9BUkdVTUVOVFMgPSAiIXt0b29sX2FyZ3N9IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9ESVJFQ1RPUlkgPSAiIXt0b29sX2Rpcn0iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UT09MX1JFRlJFU0ggPSAiIXt0b29sX3JlZnJlc2h9IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVE9PTF9TSE9XX0xPRyA9ICIhe3Rvb2xfc2hvd19sb2d9IjsgLy8kTk9OLU5MUy0xJAorCQorCS8vIEtub3duIGtpbmQgb2YgdG9vbHMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX1RZUEVfUFJPR1JBTSA9ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLnR5cGUucHJvZ3JhbSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX1RZUEVfQU5UID0gIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMudHlwZS5hbnQiOyAvLyROT04tTkxTLTEkCisJCisJLy8gVmFyaWFibGUgbmFtZXMgdGhlIHRvb2wgd2lsbCBleHBhbmQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfV09SS1NQQUNFX0xPQyA9ICJ3b3Jrc3BhY2VfbG9jIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX1BST0pFQ1RfTE9DID0gInByb2plY3RfbG9jIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9QUk9KRUNUX1BBVEggPSAicHJvamVjdF9wYXRoIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9QUk9KRUNUX05BTUUgPSAicHJvamVjdF9uYW1lIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX1JFU09VUkNFX0xPQyA9ICJyZXNvdXJjZV9sb2MiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX1JFU09VUkNFX1BBVEggPSAicmVzb3VyY2VfcGF0aCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfUkVTT1VSQ0VfTkFNRSA9ICJyZXNvdXJjZV9uYW1lIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0NPTlRBSU5FUl9MT0MgPSAiY29udGFpbmVyX2xvYyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfQ09OVEFJTkVSX1BBVEggPSAiY29udGFpbmVyX3BhdGgiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0NPTlRBSU5FUl9OQU1FID0gImNvbnRhaW5lcl9uYW1lIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0VESVRPUl9DVVJfQ09MID0gImVkaXRvcl9jdXJfY29sIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9FRElUT1JfQ1VSX0xJTkUgPSAiZWRpdG9yX2N1cl9saW5lIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9FRElUT1JfU0VMX1RFWFQgPSAiZWRpdG9yX3NlbF90ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX0FOVF9UQVJHRVQgPSAiYW50X3RhcmdldCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfQlVJTERfVFlQRSA9ICJidWlsZF90eXBlIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gS25vd24gcmVmcmVzaCBzY29wZXMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX1NDT1BFX05PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9TQ09QRV9XT1JLU1BBQ0UgPSAid29ya3NwYWNlIjsgLy8kTk9OLU5MUy0xJDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX1NDT1BFX1BST0pFQ1QgPSAicHJvamVjdCI7IC8vJE5PTi1OTFMtMSQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9TQ09QRV9XT1JLSU5HX1NFVCA9ICJ3b3JraW5nX3NldCI7IC8vJE5PTi1OTFMtMSQ7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1ZBTFVFID0gIiI7IC8vJE5PTi1OTFMtMSQ7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCisJCisJcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IFRPT0xfVFlQRV9QUk9HUkFNOworCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBFTVBUWV9WQUxVRTsKKwlwcml2YXRlIFN0cmluZyBsb2NhdGlvbiA9IEVNUFRZX1ZBTFVFOworCXByaXZhdGUgU3RyaW5nIGFyZ3VtZW50cyA9IEVNUFRZX1ZBTFVFOworCXByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeSA9IEVNUFRZX1ZBTFVFOworCXByaXZhdGUgU3RyaW5nIHJlZnJlc2hTY29wZSA9IEVNUFRZX1ZBTFVFOworCXByaXZhdGUgYm9vbGVhbiBzaG93TG9nID0gdHJ1ZTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGVtcHR5IGluaXRpYWxpemVkIGV4dGVybmFsIHRvb2wuCisJICovCisJcHVibGljIEV4dGVybmFsVG9vbCgpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5yZWZyZXNoU2NvcGUgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKFJFRlJFU0hfU0NPUEVfTk9ORSwgbnVsbCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIGZ1bGx5IGluaXRpYWxpemVkIGV4dGVybmFsIHRvb2wuCisJICovCisJcHVibGljIEV4dGVybmFsVG9vbChTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIGFyZ3VtZW50cywgU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIHJlZnJlc2hTY29wZSwgYm9vbGVhbiBzaG93TG9nKSB7CisJCXRoaXMoKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkKKwkJCXRoaXMudHlwZSA9IHR5cGU7CisJCWlmIChuYW1lICE9IG51bGwpCisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKKwkJCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKQorCQkJdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisJCWlmIChkaXJlY3RvcnkgIT0gbnVsbCkKKwkJCXRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OworCQlpZiAocmVmcmVzaFNjb3BlICE9IG51bGwpCisJCQl0aGlzLnJlZnJlc2hTY29wZSA9IHJlZnJlc2hTY29wZTsKKwkJdGhpcy5zaG93TG9nID0gc2hvd0xvZzsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhbiBleHRlcm5hbCB0b29sIGJhc2VkIG9uIHNwZWNpZmllZCBhcmd1bWVudHMuCisJICogUmV0dXJucyBudWxsIGlmIG5vIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgdG9vbCBjb3VsZCBiZSBjcmVhdGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRXh0ZXJuYWxUb29sIGZyb21Bcmd1bWVudE1hcChNYXAgYXJncykgeworCQkvLyBWYWxpZGF0ZSB0aGUgY3JpdGljYWwgaW5mb3JtYXRpb24uCisJCVN0cmluZyB0eXBlID0gKFN0cmluZylhcmdzLmdldChUQUdfVE9PTF9UWVBFKTsKKwkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWFyZ3MuZ2V0KFRBR19UT09MX05BTUUpOworCQlTdHJpbmcgbG9jYXRpb24gPSAoU3RyaW5nKWFyZ3MuZ2V0KFRBR19UT09MX0xPQ0FUSU9OKTsKKwkJaWYgKHR5cGUgPT0gbnVsbCB8fCBuYW1lID09IG51bGwgfHwgbG9jYXRpb24gPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlpZiAodHlwZS5sZW5ndGgoKSA9PSAwIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCB8fCBsb2NhdGlvbi5sZW5ndGgoKSA9PSAwKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyBzU2hvd0xvZyA9IChTdHJpbmcpYXJncy5nZXQoVEFHX1RPT0xfU0hPV19MT0cpOworCQlib29sZWFuIHNob3dMb2c7CisJCWlmIChGQUxTRS5lcXVhbHMoc1Nob3dMb2cpKQorCQkJc2hvd0xvZyA9IGZhbHNlOworCQllbHNlCisJCQlzaG93TG9nID0gdHJ1ZTsKKwkJCQorCQlyZXR1cm4gbmV3IEV4dGVybmFsVG9vbCgKKwkJCXR5cGUsCisJCQluYW1lLAorCQkJbG9jYXRpb24sCisJCQkoU3RyaW5nKWFyZ3MuZ2V0KFRBR19UT09MX0FSR1VNRU5UUyksCisJCQkoU3RyaW5nKWFyZ3MuZ2V0KFRBR19UT09MX0RJUkVDVE9SWSksCisJCQkoU3RyaW5nKWFyZ3MuZ2V0KFRBR19UT09MX1JFRlJFU0gpLAorCQkJc2hvd0xvZyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdHlwZSBvZiBleHRlcm5hbCB0b29sLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIHRvb2wuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcGF0aCB3aGVyZSB0aGUgZXh0ZXJuYWwgdG9vbCBpcyBsb2NhdGVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7CisJCXJldHVybiBsb2NhdGlvbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgYXJndW1lbnRzIGZvciB0aGUgZXh0ZXJuYWwgdG9vbC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFyZ3VtZW50cygpIHsKKwkJcmV0dXJuIGFyZ3VtZW50czsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gcnVuIHRoZSBleHRlcm5hbCB0b29sIGluLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHsKKwkJcmV0dXJuIGRpcmVjdG9yeTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc2NvcGUgb2YgcmVzb3VyY2VzIHRvIHJlZnJlc2ggYWZ0ZXIKKwkgKiB0aGUgZXh0ZXJuYWwgdG9vbCBpcyBydW4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlZnJlc2hTY29wZSgpIHsKKwkJcmV0dXJuIHJlZnJlc2hTY29wZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZXhlY3V0aW9uIGxvZyBvZiB0aGUgZXh0ZXJuYWwgdG9vbAorCSAqIHdpbGwgYmUgc2hvd24gb24gdGhlIGxvZyBjb25zb2xlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGdldFNob3dMb2coKSB7CisJCXJldHVybiBzaG93TG9nOwkKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgdHlwZSBvZiBleHRlcm5hbCB0b29sLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJaWYgKHR5cGUgPT0gbnVsbCkKKwkJCXRoaXMudHlwZSA9IEVNUFRZX1ZBTFVFOworCQllbHNlCisJCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBleHRlcm5hbCB0b29sLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkKKwkJCXRoaXMubmFtZSA9IEVNUFRZX1ZBTFVFOworCQllbHNlCisJCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBwYXRoIHdoZXJlIHRoZSBleHRlcm5hbCB0b29sIGlzIGxvY2F0ZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7CisJCWlmIChsb2NhdGlvbiA9PSBudWxsKQorCQkJdGhpcy5sb2NhdGlvbiA9IEVNUFRZX1ZBTFVFOworCQllbHNlCisJCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV4dGVybmFsIHRvb2wuCisJICovCisJcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKFN0cmluZyBhcmd1bWVudHMpIHsKKwkJaWYgKGFyZ3VtZW50cyA9PSBudWxsKQorCQkJdGhpcy5hcmd1bWVudHMgPSBFTVBUWV9WQUxVRTsKKwkJZWxzZQorCQkJdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biB0aGUgZXh0ZXJuYWwgdG9vbCBpbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsKKwkJaWYgKGRpcmVjdG9yeSA9PSBudWxsKQorCQkJdGhpcy5kaXJlY3RvcnkgPSBFTVBUWV9WQUxVRTsKKwkJZWxzZQorCQkJdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIHNjb3BlIG9mIHJlc291cmNlcyB0byByZWZyZXNoIGFmdGVyCisJICogdGhlIGV4dGVybmFsIHRvb2wgaXMgcnVuCisJICovCisJcHVibGljIHZvaWQgc2V0UmVmcmVzaFNjb3BlKFN0cmluZyByZWZyZXNoU2NvcGUpIHsKKwkJaWYgKHJlZnJlc2hTY29wZSA9PSBudWxsIHx8IHJlZnJlc2hTY29wZS5sZW5ndGgoKSA8IDEpCisJCQl0aGlzLnJlZnJlc2hTY29wZSA9IFRvb2xVdGlsLmJ1aWxkVmFyaWFibGVUYWcoUkVGUkVTSF9TQ09QRV9OT05FLCBudWxsKTsKKwkJZWxzZQorCQkJdGhpcy5yZWZyZXNoU2NvcGUgPSByZWZyZXNoU2NvcGU7CisJfQorCQorCS8qKgorCSAqIFNldHMgd2hldGhlciBvciBub3QgdGhlIGV4ZWN1dGlvbiBsb2cgb2YgdGhlIGV4dGVybmFsIHRvb2wgc2hvdWxkCisJICogYmUgc2hvd24gb24gdGhlIGxvZyBjb25zb2xlLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFNob3dMb2coYm9vbGVhbiBzaG93TG9nKSB7CisJCXRoaXMuc2hvd0xvZyA9IHNob3dMb2c7CQorCX0KKwkKKwkvKioKKwkgKiBTdG9yZXMgdGhlIGV4dGVybmFsIHRvb2wgYXMgYW4gYXJndW1lbnQgbWFwIHRoYXQgY2FuIGJlCisJICogdXNlZCBsYXRlciBvbiB0byByZWNyZWF0ZSB0aGlzIGV4dGVybmFsIHRvb2wuCisJICogCisJICogQHJldHVybiB0aGUgYXJndW1lbnQgbWFwCisJICovCisJcHVibGljIE1hcCB0b0FyZ3VtZW50TWFwKCkgeworCQlIYXNoTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOworCQlhcmdzLnB1dChUQUdfVE9PTF9UWVBFLCB0eXBlKTsKKwkJYXJncy5wdXQoVEFHX1RPT0xfTkFNRSwgbmFtZSk7CisJCWFyZ3MucHV0KFRBR19UT09MX0xPQ0FUSU9OLCBsb2NhdGlvbik7CisJCWFyZ3MucHV0KFRBR19UT09MX0FSR1VNRU5UUywgYXJndW1lbnRzKTsKKwkJYXJncy5wdXQoVEFHX1RPT0xfRElSRUNUT1JZLCBkaXJlY3RvcnkpOworCQlhcmdzLnB1dChUQUdfVE9PTF9SRUZSRVNILCByZWZyZXNoU2NvcGUpOworCQlpZiAoc2hvd0xvZykKKwkJCWFyZ3MucHV0KFRBR19UT09MX1NIT1dfTE9HLCBUUlVFKTsKKwkJZWxzZQorCQkJYXJncy5wdXQoVEFHX1RPT0xfU0hPV19MT0csIEZBTFNFKTsKKwkJCisJCXJldHVybiBhcmdzOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIGJ1aWxkIGNvbW1hbmQgdG8gaW52b2tlIHRoaXMKKwkgKiBleHRlcm5hbCB0b29sLgorCSAqIAorCSAqIEBwYXJhbSBjb21tYW5kIHRoZSBidWlsZCBjb21tYW5kIHRvIGNvbmZpZ3VyZQorCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgY29tbWFuZC4KKwkgKi8KKwlwdWJsaWMgSUNvbW1hbmQgdG9CdWlsZENvbW1hbmQoSUNvbW1hbmQgY29tbWFuZCkgeworCQlNYXAgYXJncyA9IHRvQXJndW1lbnRNYXAoKTsKKwkJY29tbWFuZC5zZXRCdWlsZGVyTmFtZShFeHRlcm5hbFRvb2xzQnVpbGRlci5JRCk7CisJCWNvbW1hbmQuc2V0QXJndW1lbnRzKGFyZ3MpOworCQkKKwkJcmV0dXJuIGNvbW1hbmQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvRXh0ZXJuYWxUb29sc0J1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbHNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyOTUwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbHNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKKworLyoqCisgKiBUaGUgZXh0ZXJuYWwgdG9vbCBidWlsZGVyIGNhbiBiZSBhZGRlZCB0byB0aGUgYnVpbGQgc3BlYyBvZiBhIHByb2plY3QgdG8gcnVuIAorICogZXh0ZXJuYWwgdG9vbHMgaW5zaWRlIHRoZSBpbmNyZW1lbnRhbCBidWlsZCBwcm9jZXNzLgorICogPHA+CisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgb25seSBldmVyIG9uZSBpbnN0YW5jZSBvZiBFeHRlcm5hbFRvb2xzQnVpbGRlciBwZXIgcHJvamVjdCwKKyAqIGFuZCB0aGUgZXh0ZXJuYWwgdG9vbCB0byBydW4gaXMgc3BlY2lmaWVkIGluIHRoZSBidWlsZGVyJ3MgYXJndW1lbnRzLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXh0ZXJuYWxUb29sc0J1aWxkZXIgZXh0ZW5kcyBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXIiOworCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGV4dGVybmFsIHRvb2wgYnVpbGRlci4KKwkgKi8KKwlwdWJsaWMgRXh0ZXJuYWxUb29sc0J1aWxkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci4KKwkgKi8KKwlwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlFeHRlcm5hbFRvb2wgdG9vbCA9IEV4dGVybmFsVG9vbC5mcm9tQXJndW1lbnRNYXAoYXJncyk7CisJCWlmICh0b29sICE9IG51bGwpIHsKKwkJCURlZmF1bHRSdW5uZXJDb250ZXh0IGNvbnRleHQgPSBuZXcgRGVmYXVsdFJ1bm5lckNvbnRleHQodG9vbCwgZ2V0UHJvamVjdCgpLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkpOworCQkJY29udGV4dC5zZXRCdWlsZFR5cGUoa2luZCk7CisJCQl0cnkgeworCQkJCWNvbnRleHQucnVuKG1vbml0b3IpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCS8vIERvIG5vdGhpbmcsIHRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZCBieSB0aGUgdXNlcgorCQkJfSBmaW5hbGx5IHsKKwkJCQlmb3JnZXRMYXN0QnVpbHRTdGF0ZSgpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9FeHRlcm5hbFRvb2xzUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9FeHRlcm5hbFRvb2xzUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3ZDcyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbHNQbHVnaW4uamF2YQpAQCAtMCwwICsxLDEwNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKKworLyoqCisgKiBFeHRlcm5hbCB0b29scyBwbHVnLWluIGNsYXNzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHRlcm5hbFRvb2xzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMiOyAvLyROT04tTkxTLTEkOworCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0NPTlNPTEVfSUQgPSBQTFVHSU5fSUQgKyAiLkxvZ0NvbnNvbGVWaWV3IjsgLy8kTk9OLU5MUy0xJDsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UX1RPT0w9ICJpY29ucy9mdWxsL29iajE2L2FudF9maWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0JVSUxERVI9ICJpY29ucy9mdWxsL29iajE2L2J1aWxkZXIuZ2lmIjsgLy8kTk9OLU5MUy0xJDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfSkFSX0ZJTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9qYXJfbF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xBU1NQQVRIID0gImljb25zL2Z1bGwvb2JqMTYvY2xhc3NwYXRoLmdpZiI7IC8vJE5PTi1OTFMtMSQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1RZUEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZiI7IC8vJE5PTi1OTFMtMSQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VYVEVSTkFMX1RPT0wgPSAiaWNvbnMvZnVsbC9vYmoxNi9leHRlcm5hbF90b29scy5naWYiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0lOVkFMSURfQlVJTERfVE9PTCA9ICJpY29ucy9mdWxsL29iajE2L2ludmFsaWRfYnVpbGRfdG9vbC5naWYiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9FWFRFUk5BTF9UT09MUyA9ICJpY29ucy9mdWxsL3dpemJhbi9leHRfdG9vbHNfd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwcml2YXRlIHN0YXRpYyBFeHRlcm5hbFRvb2xzUGx1Z2luIHBsdWdpbjsKKwlwcml2YXRlIEV4dGVybmFsVG9vbHNSZWdpc3RyeSByZWdpc3RyeTsKKwkKKwkvKioKKwkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIEV4dGVybmFsIFRvb2xzIHBsdWctaW4uCisJICovCisJcHVibGljIEV4dGVybmFsVG9vbHNQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQlzdXBlcihkZXNjcmlwdG9yKTsKKwkJcGx1Z2luID0gdGhpczsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIuCisJICogVGhpcyByZXByZXNlbnRzIHRoZSBydW50aW1lIHBsdWdpbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4dGVybmFsVG9vbHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWdpc3RyeSBvZiBleHRlcm5hbCB0b29scyB0aGF0IHRoZQorCSAqIHVzZXIgY2FuIHJ1biB1c2luZyB0aGUgZXh0ZXJuYWwgdG9vbHMgbWVudS4gRG9lcworCSAqIG5vdCBpbmNsdWRlIGV4dGVybmFsIHRvb2xzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MuCisJICovCisJcHVibGljIEV4dGVybmFsVG9vbHNSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKKwkJaWYgKHJlZ2lzdHJ5ID09IG51bGwpCisJCQlyZWdpc3RyeSA9IG5ldyBFeHRlcm5hbFRvb2xzUmVnaXN0cnkoKTsKKwkJcmV0dXJuIHJlZ2lzdHJ5OworCX0KKworCS8qKgorCSAqIFdyaXRlcyB0aGUgbWVzc2FnZSB0byB0aGUgcGx1Zy1pbidzIGxvZworCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSB0ZXh0IHRvIHdyaXRlIHRvIHRoZSBsb2cKKwkgKi8KKwlwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7CisJCWdldExvZygpLmxvZyhzdGF0dXMpOworCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgSW1hZ2VEZXNjcmlwdG9yIGZvciB0aGUgaWNvbiB3aXRoIHRoZSBnaXZlbiBwYXRoCisJICogCisJICogQHJldHVybiB0aGUgSW1hZ2VEZXNjcmlwdG9yIG9iamVjdAorCSAqLworCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7CisJCXRyeSB7CisJCQlVUkwgaW5zdGFsbFVSTCA9IGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCk7CisJCQlVUkwgdXJsID0gbmV3IFVSTChpbnN0YWxsVVJMLHBhdGgpOworCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIGluIEFic3RyYWN0VUlQbHVnaW4uCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcyhJUHJlZmVyZW5jZVN0b3JlIHByZWZzKSB7CisJCXByZWZzLnNldERlZmF1bHQoSVByZWZlcmVuY2VDb25zdGFudHMuQVVUT19TQVZFLCBmYWxzZSk7CisJCXByZWZzLnNldERlZmF1bHQoSVByZWZlcmVuY2VDb25zdGFudHMuSU5GT19MRVZFTCwgdHJ1ZSk7CisJCXByZWZzLnNldERlZmF1bHQoSVByZWZlcmVuY2VDb25zdGFudHMuVkVSQk9TRV9MRVZFTCwgZmFsc2UpOworCQlwcmVmcy5zZXREZWZhdWx0KElQcmVmZXJlbmNlQ29uc3RhbnRzLkRFQlVHX0xFVkVMLCBmYWxzZSk7CisJCisJCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChwcmVmcywgSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9FUlJPUl9SR0IsIG5ldyBSR0IoMjU1LCAwLCAwKSk7IAkJLy8gcmVkIC0gZXhhY3RseSB0aGUgc2FtZSBhcyBkZWJ1ZyBDb25zb2wKKwkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHByZWZzLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfUkdCLCBuZXcgUkdCKDI1NSwgMTAwLCAwKSk7IAkvLyBvcmFuZ2UKKwkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHByZWZzLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0lORk9fUkdCLCBuZXcgUkdCKDAsIDAsIDI1NSkpOyAJCS8vIGJsdWUKKwkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHByZWZzLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1ZFUkJPU0VfUkdCLCBuZXcgUkdCKDAsIDIwMCwgMTI1KSk7CS8vIGdyZWVuCisJCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChwcmVmcywgSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9ERUJVR19SR0IsIG5ldyBSR0IoMCwgMCwgMCkpOwkJCS8vIGJsYWNrCisJfQkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbHNSZWdpc3RyeS5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvRXh0ZXJuYWxUb29sc1JlZ2lzdHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhY2RlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbHNSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuWE1MTWVtZW50bzsKKworLyoqCisgKiBUaGUgcmVnaXN0cnkgb2YgdXNlciBkZWZpbmVkIGV4dGVybmFsIHRvb2xzIHRoYXQgY2FuCisgKiBiZSBydW4gdXNpbmcgdGhlIGV4dGVybmFsIHRvb2wgbWVudS4gSXQgZG9lcyBub3QgaW5jbHVkZQorICogYW55IGV4dGVybmFsIHRvb2xzIHRoYXQgYXJlIGFzc2lnbmVkIGFzIGJ1aWxkZXJzIG9uIGEKKyAqIHByb2plY3QuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHRlcm5hbFRvb2xzUmVnaXN0cnkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9GSUxFX05BTUUgPSAiZXh0ZXJuYWx0b29scy54bWwiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FWFRFUk5BTFRPT0xTID0gImV4dGVybmFsdG9vbHMiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UT09MID0gInRvb2wiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FTlRSWSA9ICJlbnRyeSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0tFWSA9ICJrZXkiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwcml2YXRlIEFycmF5TGlzdCBleHRlcm5hbFRvb2xzOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgcmVnaXN0cnkgYW5kIGxvYWRzIHRoZSBzYXZlZAorCSAqIGV4dGVybmFsIHRvb2xzLgorCSAqLworCS8qcGFja2FnZSovIEV4dGVybmFsVG9vbHNSZWdpc3RyeSgpIHsKKwkJc3VwZXIoKTsKKwkJbG9hZEV4dGVybmFsVG9vbHMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lZCBleHRlcm5hbCB0b29sIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm90IGZvdW5kLgorCSAqLworCXB1YmxpYyBFeHRlcm5hbFRvb2wgZ2V0RXh0ZXJuYWxUb29sKFN0cmluZyBuYW1lKSB7CisJCUl0ZXJhdG9yIGVudW0gPSBleHRlcm5hbFRvb2xzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChlbnVtLmhhc05leHQoKSkgeworCQkJRXh0ZXJuYWxUb29sIHRvb2wgPSAoRXh0ZXJuYWxUb29sKWVudW0ubmV4dCgpOworCQkJaWYgKHRvb2wuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKKwkJCQlyZXR1cm4gdG9vbDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZXh0ZXJuYWwgdG9vbHMgb2YgdGhlIHJlZ2lzdHJ5CisJICovCisJcHVibGljIEFycmF5TGlzdCBnZXRFeHRlcm5hbFRvb2xzKCkgeworCQlyZXR1cm4gZXh0ZXJuYWxUb29sczsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgZXh0ZXJuYWwgdG9vbHMgZm9yIHRoZSByZWdpc3RyeS4KKwkgKiBDYXVzZXMgdGhlbSB0byBiZSBzYXZlZCB0byBkaXNrLgorCSAqLworCXB1YmxpYyBib29sZWFuIHNldEV4dGVybmFsVG9vbHMoQXJyYXlMaXN0IHRvb2xzKSB7CisJCXRoaXMuZXh0ZXJuYWxUb29scyA9IHRvb2xzOworCQlyZXR1cm4gc2F2ZUV4dGVybmFsVG9vbHMoKTsKKwl9CisJCisJLyoqCisJICogTG9hZHMgdGhlIGV4dGVybmFsIHRvb2xzIGZyb20gc3RvcmFnZSBhbmQKKwkgKiBhZGRzIHRoZW0gdG8gdGhlIHJlZ2lzdHJ5LgorCSAqLworCXByaXZhdGUgdm9pZCBsb2FkRXh0ZXJuYWxUb29scygpIHsKKwkJSVBhdGggcGF0aCA9IEV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKKwkJcGF0aCA9IHBhdGguYXBwZW5kKFNUQVRFX0ZJTEVfTkFNRSk7CisJCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7CisJCXRyeSB7CisJCQlGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgudG9GaWxlKCkpOworCQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0LCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAorCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVSZWFkUm9vdChyZWFkZXIpOworCQkJCisJCQkvLyBHZXQgdGhlIGV4dGVybmFsIHRvb2wgY2hpbGRyZW4gZWxlbWVudAorCQkJSU1lbWVudG9bXSB0b29scyA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oVEFHX1RPT0wpOworCQkJZXh0ZXJuYWxUb29scyA9IG5ldyBBcnJheUxpc3QodG9vbHMubGVuZ3RoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbHMubGVuZ3RoOyBpKyspIHsKKwkJCQlIYXNoTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOworCQkJCUlNZW1lbnRvW10gZW50cmllcyA9IHRvb2xzW2ldLmdldENoaWxkcmVuKFRBR19FTlRSWSk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7CisJCQkJCVN0cmluZyBrZXkgPSBlbnRyaWVzW2pdLmdldFN0cmluZyhUQUdfS0VZKTsKKwkJCQkJaWYgKGtleSAhPSBudWxsKSB7CisJCQkJCQlTdHJpbmcgdmFsdWUgPSBlbnRyaWVzW2pdLmdldFRleHREYXRhKCk7CisJCQkJCQlhcmdzLnB1dChrZXksIHZhbHVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlFeHRlcm5hbFRvb2wgdG9vbCA9IEV4dGVybmFsVG9vbC5mcm9tQXJndW1lbnRNYXAoYXJncyk7CisJCQkJaWYgKHRvb2wgIT0gbnVsbCkKKwkJCQkJZXh0ZXJuYWxUb29scy5hZGQodG9vbCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBTaWxlbnRseSBpZ25vcmUgdGhpcy4uLgorCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5sb2coIkZpbGUgSS9PIGVycm9yIHdpdGggZXh0ZXJuYWwgdG9vbCBzdGF0ZSByZWFkZXIuIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQljYXRjaCAoV29ya2JlbmNoRXhjZXB0aW9uIGUpIHsKKwkJCUV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3Igd2l0aCBleHRlcm5hbCB0b29sIHN0YXRlIHJlYWRlci4gU2VlIC5sb2cgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlmaW5hbGx5IHsKKwkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXJlYWRlci5jbG9zZSgpOworCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJCQlFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5sb2coIlVuYWJsZSB0byBjbG9zZSBleHRlcm5hbCB0b29sIHN0YXRlIHJlYWRlci4iLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0KKwkJCWlmIChleHRlcm5hbFRvb2xzID09IG51bGwpCisJCQkJZXh0ZXJuYWxUb29scyA9IG5ldyBBcnJheUxpc3QoMCk7CisJCX0KKwl9CisJCisJLyoqCisJICogU2F2ZXMgdGhlIGV4dGVybmFsIHRvb2wgdG8gc3RvcmFnZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgc2F2ZSBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJLypwYWNrYWdlKi8gYm9vbGVhbiBzYXZlRXh0ZXJuYWxUb29scygpIHsKKwkJYm9vbGVhbiBzdWNjZXNzZnVsID0gdHJ1ZTsKKwkJCisJCS8vIFBvcHVsYXRlIHRoZSBtZW1lbnRvCisJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KFRBR19FWFRFUk5BTFRPT0xTKTsKKwkJSXRlcmF0b3IgZW51bSA9IGV4dGVybmFsVG9vbHMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGVudW0uaGFzTmV4dCgpKSB7CisJCQlJTWVtZW50byB0b29sTWVtZW50byA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX1RPT0wpOworCQkJRXh0ZXJuYWxUb29sIHRvb2wgPSAoRXh0ZXJuYWxUb29sKWVudW0ubmV4dCgpOworCQkJTWFwIGFyZ3MgPSB0b29sLnRvQXJndW1lbnRNYXAoKTsKKwkJCUl0ZXJhdG9yIGVudHJpZXMgPSBhcmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgeworCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpZW50cmllcy5uZXh0KCk7CisJCQkJSU1lbWVudG8gZW50cnlNZW1lbnRvID0gdG9vbE1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX0VOVFJZKTsKKwkJCQllbnRyeU1lbWVudG8ucHV0U3RyaW5nKFRBR19LRVksIChTdHJpbmcpZW50cnkuZ2V0S2V5KCkpOworCQkJCWVudHJ5TWVtZW50by5wdXRUZXh0RGF0YSgoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJLy8gV3JpdGUgdGhlIG1lbWVudG8gdG8gdGhlIHN0YXRlIGZpbGUJCQorCQlJUGF0aCBwYXRoID0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOworCQlwYXRoID0gcGF0aC5hcHBlbmQoU1RBVEVfRklMRV9OQU1FKTsKKwkJRmlsZSBzdGF0ZUZpbGUgPSBwYXRoLnRvRmlsZSgpOworCQl0cnkgeworCQkJRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzdGF0ZUZpbGUpOworCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAorCQkJbWVtZW50by5zYXZlKHdyaXRlcik7CisJCQl3cml0ZXIuY2xvc2UoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJc3RhdGVGaWxlLmRlbGV0ZSgpOworCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoCisJCQkJbnVsbCwKKwkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHRlcm5hbFRvb2xzUmVnaXN0cnkuc2F2ZVN0YXRlRXJyb3JUaXRsZSIpLCAvLyROT04tTkxTLTEkCisJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRXh0ZXJuYWxUb29sc1JlZ2lzdHJ5LnNhdmVTdGF0ZUVycm9yIikpOyAvLyROT04tTkxTLTEkCisJCQlzdWNjZXNzZnVsID0gZmFsc2U7CisJCX0KKwkJCisJCXJldHVybiBzdWNjZXNzZnVsOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbHNSdW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0V4dGVybmFsVG9vbHNSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgyYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvRXh0ZXJuYWxUb29sc1J1bm5lci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CisKKy8qKgorICogUmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyB0aGUgZXh0ZXJuYWwgdG9vbC4gQ2xpZW50cworICogbXVzdCBwcm92aWRlIGEgcHVibGljIG5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlcm5hbFRvb2xzUnVubmVyIHsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gZW1wdHkgZXh0ZXJuYWwgdG9vbCBydW5uZXIKKwkgKi8KKwlwdWJsaWMgRXh0ZXJuYWxUb29sc1J1bm5lcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlIHRoZSBleHRlcm5hbCB0b29sIHdpdGhpbiB0aGUgZ2l2ZW4gY29udGV4dC4gU3ViY2xhc3NlcworCSAqIGFyZSByZXNwb25zaWJsZSBmb3Igc2hvd2luZyB0aGUgZXhlY3V0aW9uIGxvZyBpZgorCSAqIHNwZWNpZmllZCBpbiB0aGUgY29udGV4dC4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVJ1bm5lckNvbnRleHQgcnVubmVyQ29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uOworCQorCS8qKgorCSAqIEhhbmRsZXMgZXhjZXB0aW9ucyB0aGF0IG1heSBvY2N1ciB3aGlsZSBydW5uaW5nLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7CisJCWlmIChtc2cgPT0gbnVsbCkKKwkJCW1zZyA9IFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkV4dGVybmFsVG9vbHNSdW5uZXIuaW50ZXJuYWxFcnJvck1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJDsKKwkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFeHRlcm5hbFRvb2xzUGx1Z2luLlBMVUdJTl9JRCwgMCwgbXNnLCBlKSk7CisJfQorCisJLyoqCisJICogU3RhcnRzIHRoZSBtb25pdG9yIHRvIHNob3cgcHJvZ3Jlc3Mgd2hpbGUgcnVubmluZy4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdGFydE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUnVubmVyQ29udGV4dCBydW5uZXJDb250ZXh0LCBpbnQgd29ya0Ftb3VudCkgeworCQlTdHJpbmcgbGFiZWwgPSBUb29sTWVzc2FnZXMuZm9ybWF0KCJFeHRlcm5hbFRvb2xzUnVubmVyLnJ1bm5pbmdUb29sTGFiZWwiLCBuZXcgT2JqZWN0W10ge3J1bm5lckNvbnRleHQuZ2V0TmFtZSgpfSk7IC8vJE5PTi1OTFMtMSQ7CisJCW1vbml0b3IuYmVnaW5UYXNrKGxhYmVsLCB3b3JrQW1vdW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9JUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvSVByZWZlcmVuY2VDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWU3ZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvSVByZWZlcmVuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBDb25zdGFudHMgdXNlZCB0byBpZGVudGlmeSB1c2VyIHByZWZlcmVuY2VzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElQcmVmZXJlbmNlQ29uc3RhbnRzIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1NBVkUgPSAiZXh0ZXJuYWx0b29scy5hdXRvX3NhdmUiOyAvLyAkTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VQVVRfTEVWRUwgPSAiZXh0ZXJuYWx0b29scy5vdXRwdXRMZXZlbCI7IC8vICROT04tTkxTLTEkCisgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9fTEVWRUwgPSAiZXh0ZXJuYWx0b29scy5pbmZvTGV2ZWwiOyAvLyAkTk9OLU5MUy0xJAorIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJCT1NFX0xFVkVMID0gImV4dGVybmFsdG9vbHMudmVyYm9zZUxldmVsIjsgLy8gJE5PTi1OTFMtMSQKKyAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfTEVWRUwgPSAiZXh0ZXJuYWx0b29scy5sZXZlbExldmVsIjsgLy8gJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TT0xFX0VSUk9SX1JHQiA9ICJleHRlcm5hbHRvb2xzLmNvbnNvbGUuZXJyb3JDb2xvciI7IC8vICROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU09MRV9XQVJOSU5HX1JHQiA9ICJleHRlcm5hbHRvb2xzLmNvbnNvbGUud2FybmluZ0NvbG9yIjsgLy8gJE5PTi1OTFMtMSQKKyAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU09MRV9JTkZPX1JHQiA9ICJleHRlcm5hbHRvb2xzLmNvbnNvbGUuaW5mb0NvbG9yIjsgLy8gJE5PTi1OTFMtMSQKKyAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU09MRV9WRVJCT1NFX1JHQiA9ICJleHRlcm5hbHRvb2xzLmNvbnNvbGUudmVyYm9zZUNvbG9yIjsgLy8gJE5PTi1OTFMtMSQKKyAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU09MRV9ERUJVR19SR0IgPSAiZXh0ZXJuYWx0b29scy5jb25zb2xlLmRlYnVnQ29sb3IiOyAvLyAkTk9OLU5MUy0xJAorIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TT0xFX0ZPTlQgPSAiZXh0ZXJuYWx0b29scy5jb25zb2xlLmZvbnQiOyAvLyAkTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvSVJ1bm5lckNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0lSdW5uZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViZDE5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL0lSdW5uZXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgY29udGV4dCBpbiB3aGljaCB0byBydW4gdGhlCisgKiBleHRlcm5hbCB0b29scy4KKyAqLworcHVibGljIGludGVyZmFjZSBJUnVubmVyQ29udGV4dCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZXh0ZXJuYWwgdG9vbC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXRoIHdoZXJlIHRoZSBleHRlcm5hbCB0b29sIGlzIGxvY2F0ZWQuIEFsbAorCSAqIHZhcmlhYmxlcyBlbWJlZGRlZCBpbiB0aGUgcGF0aCBoYXZlIGJlZW4gZnVsbHkKKwkgKiBleHBhbmRlZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEV4cGFuZGVkTG9jYXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0YXJnZXRzIGZvciBhbiBBbnQgZmlsZS4gVGhlCisJICogdGFyZ2V0cyBhcmUgY29sbGVjdGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiB2YXJpYWJsZSB0YWdzIGluIHRoZSBleHRlcm5hbCB0b29sJ3MgYXJndW1lbnRzLgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRBbnRUYXJnZXRzKCk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgYXJndW1lbnRzIGZvciB0aGUgZXh0ZXJuYWwgdG9vbC4gQWxsCisJICogdmFyaWFibGVzIGVtYmVkZGVkIGluIHRoZSBhcmd1bWVudHMgaGF2ZSBiZWVuIGZ1bGx5CisJICogZXhwYW5kZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFeHBhbmRlZEFyZ3VtZW50cygpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biB0aGUgZXh0ZXJuYWwgdG9vbCBpbi4KKwkgKiBBbGwgdmFyaWFibGVzIGVtYmVkZGVkIGluIHRoZSBwYXRoIGhhdmUgYmVlbiBmdWxseQorCSAqIGV4cGFuZGVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kZWRXb3JraW5nRGlyZWN0b3J5KCk7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZXhlY3V0aW9uIGxvZyBmb3IgdGhlCisJICogZXh0ZXJuYWwgdG9vbCBzaG91bGQgYXBwZWFyIG9uIHRoZSBsb2cgY29uc29sZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBnZXRTaG93TG9nKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9Qcm9ncmFtUnVubmVyLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9Qcm9ncmFtUnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0ZGVlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL1Byb2dyYW1SdW5uZXIuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWkuTG9nQ29uc29sZURvY3VtZW50OworCisvKioKKyAqIEV4ZWN1dGUgZXh0ZXJuYWwgdG9vbHMgdGhhdCByZXByZXNlbnQgcHJvZ3JhbXMgaW4gdGhlIGZpbGUKKyAqIHN5c3RlbS4KKyAqLworcHVibGljIGNsYXNzIFByb2dyYW1SdW5uZXIgZXh0ZW5kcyBFeHRlcm5hbFRvb2xzUnVubmVyIHsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gZW1wdHkgcHJvZ3JhbSBydW5uZXIKKwkgKi8KKwlwdWJsaWMgUHJvZ3JhbVJ1bm5lcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIGluIEV4dGVybmFsVG9vbHNSdW5uZXIuCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElSdW5uZXJDb250ZXh0IHJ1bm5lckNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCVN0cmluZyBjb21tYW5kTGluZSA9IHJ1bm5lckNvbnRleHQuZ2V0RXhwYW5kZWRMb2NhdGlvbigpICsgIiAiICsgcnVubmVyQ29udGV4dC5nZXRFeHBhbmRlZEFyZ3VtZW50cygpOyAvLyROT04tTkxTLTEkOworCQl0cnkgeworCQkJRmlsZSB3b3JraW5nRGlyID0gbnVsbDsKKwkJCWlmIChydW5uZXJDb250ZXh0LmdldEV4cGFuZGVkV29ya2luZ0RpcmVjdG9yeSgpLmxlbmd0aCgpID4gMCkKKwkJCQl3b3JraW5nRGlyID0gbmV3IEZpbGUocnVubmVyQ29udGV4dC5nZXRFeHBhbmRlZFdvcmtpbmdEaXJlY3RvcnkoKSk7CisJCQlzdGFydE1vbml0b3IobW9uaXRvciwgcnVubmVyQ29udGV4dCwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKKwkJCWJvb2xlYW5bXSBmaW5pc2hlZCA9IG5ldyBib29sZWFuWzFdOworCQkJCisJCQlmaW5pc2hlZFswXSA9IGZhbHNlOworCQkJUHJvY2VzcyBwOworCQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCkKKwkJCQlwID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kTGluZSwgbnVsbCwgd29ya2luZ0Rpcik7CisJCQllbHNlCisJCQkJcCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZExpbmUpOwkJCisJCQluZXcgVGhyZWFkKGdldFJ1bm5hYmxlKHAuZ2V0SW5wdXRTdHJlYW0oKSwgTG9nQ29uc29sZURvY3VtZW50LmdldEluc3RhbmNlKCksIExvZ0NvbnNvbGVEb2N1bWVudC5NU0dfSU5GTywgZmluaXNoZWQsIHJ1bm5lckNvbnRleHQuZ2V0U2hvd0xvZygpKSkuc3RhcnQoKTsKKwkJCW5ldyBUaHJlYWQoZ2V0UnVubmFibGUocC5nZXRFcnJvclN0cmVhbSgpLCBMb2dDb25zb2xlRG9jdW1lbnQuZ2V0SW5zdGFuY2UoKSwgTG9nQ29uc29sZURvY3VtZW50Lk1TR19FUlIsIGZpbmlzaGVkLCBydW5uZXJDb250ZXh0LmdldFNob3dMb2coKSkpLnN0YXJ0KCk7CisJCisJCQlwLndhaXRGb3IoKTsKKwkJCQkKKwkJCS8vIFNsZWVwIHRvIGFsbG93IHRoZSB0d28gbmV3IHRocmVhZHMgdG8gYmVnaW4gcmVhZGluZworCQkJLy8gdGhlIHByb2dyYW0tcnVubmluZyBwcm9jZXNzJ3MgaW5wdXQgYW5kIGVycm9yIHN0cmVhbXMKKwkJCS8vIGJlZm9yZSBmaW5pc2hlZFswXSBpcyBzZXQgdG8gdHJ1ZS4gVGhpcyBpcyBlc3BlY2lhbGx5CisJCQkvLyBuZWNlc3Nhcnkgd2l0aCBzaG9ydCBwcm9ncmFtcyB0aGF0IGV4ZWN1dGUgcXVpY2tseS4gSWYKKwkJCS8vIGZpbmlzaGVkWzBdIGlzIHNldCB0byB0cnVlIGJlZm9yZSB0aGUgdGhyZWFkcyBydW4sCisJCQkvLyBub3RoaW5nIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBpbnB1dCBhbmQgZXJyb3Igc3RyZWFtcy4KKwkJCVRocmVhZC5zbGVlcCgyMDApOworCQkJCQorCQkJZmluaXNoZWRbMF0gPSB0cnVlOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQloYW5kbGVFeGNlcHRpb24oZSk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCW1vbml0b3IuZG9uZSgpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHJ1bm5hYmxlIHRoYXQgaXMgdXNlZCB0byBjYXB0dXJlIGFuZCBwcmludCBvdXQgYSBzdHJlYW0KKwkgKiBmcm9tIGFub3RoZXIgcHJvY2Vzcy4KKwkgKi8KKwlwcml2YXRlIFJ1bm5hYmxlIGdldFJ1bm5hYmxlKGZpbmFsIElucHV0U3RyZWFtIGlucHV0LCBmaW5hbCBMb2dDb25zb2xlRG9jdW1lbnQgZG9jdW1lbnQsIGZpbmFsIGludCBzZXZlcml0eSwgZmluYWwgYm9vbGVhbltdIGZpbmlzaGVkLCBmaW5hbCBib29sZWFuIHNob3dMb2cpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlTdHJpbmdCdWZmZXIgc2I7CisJCQkJCXdoaWxlICghZmluaXNoZWRbMF0pIHsKKwkJCQkJCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQkJaW50IGMgPSBpbnB1dC5yZWFkKCk7CisJCQkJCQl3aGlsZSAoYyAhPSAtMSkgeworCQkJCQkJCXNiLmFwcGVuZCgoY2hhciljKTsKKwkJCQkJCQljID0gaW5wdXQucmVhZCgpOworCQkJCQkJfQorCQkJCQkJaWYgKHNob3dMb2cpCisJCQkJCQkJZG9jdW1lbnQuYXBwZW5kKHNiLnRvU3RyaW5nKCksIHNldmVyaXR5KTsKKwkJCQkJCXRyeSB7CisJCQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7CisJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaW5wdXQuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL1Rvb2xNZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvVG9vbE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkMjM4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL1Rvb2xNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3Mgd2hpY2ggaGVscHMgbWFuYWdpbmcgbWVzc2FnZXMKKyAqLworcHVibGljIGNsYXNzIFRvb2xNZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRT0gIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUkVTT1VSQ0VfQlVORExFKTsKKwkKKwlwcml2YXRlIFRvb2xNZXNzYWdlcygpeworCQkvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24gb2YgY2xhc3MKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBrZXkgaW4KKwkgKiB0aGUgcmVzb3VyY2UgYnVuZGxlLiAKKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIG1lc3NhZ2UgbmFtZQorCSAqIEBwYXJhbSBhcmdzIHRoZSBtZXNzYWdlIGFyZ3VtZW50cworCSAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBtZXNzYWdlCisJICovCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7CisJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5IGluCisJICogdGhlIHJlc291cmNlIGJ1bmRsZS4gSWYgdGhlcmUgaXNuJ3QgYW55IHZhbHVlIHVuZGVyCisJICogdGhlIGdpdmVuIGtleSwgdGhlIGtleSBpcyByZXR1cm5lZC4KKwkgKgorCSAqIEBwYXJhbSBrZXkgdGhlIG1lc3NhZ2UgbmFtZQorCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UKKwkgKi8JCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4ga2V5OworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIHBsdWctaW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgeworCQlyZXR1cm4gYnVuZGxlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL1Rvb2xVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9Ub29sVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDY2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvY29yZS9Ub29sVXRpbC5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aS4qOworCisvKioKKyAqIEdlbmVyYWwgdXRpbGl0eSBjbGFzcyBkZWFsaW5nIHdpdGggZXh0ZXJuYWwgdG9vbHMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRvb2xVdGlsIHsKKwkvKioKKwkgKiBWYXJpYWJsZSB0YWcgaW5kZW50aWZpZXJzCisJICovCisJLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfVEFHX1NUQVJUID0gIiR7IjsgLy8kTk9OLU5MUy0xJAorCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX1RBR19FTkQgPSAifSI7IC8vJE5PTi1OTFMtMSQKKwkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9UQUdfU0VQID0gIjoiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBCdWlsZCB0eXBlcyAod2hhdCB0eXBlIG9mIGJ1aWxkIGlzIG9jY3VyaW5nIHdoZW4gYSB0b29sIGlzIHJ1bikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9UWVBFX0lOQ1JFTUVOVEFMID0gImluY3JlbWVudGFsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1RZUEVfRlVMTCA9ICJmdWxsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1RZUEVfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1RZUEVfTk9ORSA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAorCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFRvb2xVdGlsIGluc3RhbmNlID0gbmV3IFRvb2xVdGlsKCk7CisJCisJLyoqCisJICogTm8gaW5zdGFuY2VzIGFsbG93ZWQKKwkgKi8KKwlwcml2YXRlIFRvb2xVdGlsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEJ1aWxkcyBhIHZhcmlhYmxlIHRhZyB0aGF0IHdpbGwgYmUgYXV0by1leHBhbmRlZCBiZWZvcmUKKwkgKiB0aGUgdG9vbCBpcyBydW4uCisJICogCisJICogQHBhcmFtIHZhck5hbWUgdGhlIG5hbWUgb2YgYSBrbm93biB2YXJpYWJsZSAob25lIG9mIHRoZSBWQVJfKiBjb25zdGFudHMpCisJICogQHBhcmFtIHZhckFyZ3VtZW50IGFuIG9wdGlvbmFsIGFyZ3VtZW50IGZvciB0aGUgdmFyaWFibGUsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFZhcmlhYmxlVGFnKFN0cmluZyB2YXJOYW1lLCBTdHJpbmcgdmFyQXJndW1lbnQpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVpbGRWYXJpYWJsZVRhZyh2YXJOYW1lLHZhckFyZ3VtZW50LCBidWYpOworCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIEJ1aWxkcyBhIHZhcmlhYmxlIHRhZyB0aGF0IHdpbGwgYmUgYXV0by1leHBhbmRlZCBiZWZvcmUKKwkgKiB0aGUgdG9vbCBpcyBydW4uCisJICogCisJICogQHBhcmFtIHZhck5hbWUgdGhlIG5hbWUgb2YgYSBrbm93biB2YXJpYWJsZSAob25lIG9mIHRoZSBWQVJfKiBjb25zdGFudHMpCisJICogQHBhcmFtIHZhckFyZ3VtZW50IGFuIG9wdGlvbmFsIGFyZ3VtZW50IGZvciB0aGUgdmFyaWFibGUsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgdGhlIGNvbnN0cnVjdGVkIHZhcmlhYmxlIHRhZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFZhcmlhYmxlVGFnKFN0cmluZyB2YXJOYW1lLCBTdHJpbmcgdmFyQXJndW1lbnQsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJYnVmZmVyLmFwcGVuZChWQVJfVEFHX1NUQVJUKTsKKwkJYnVmZmVyLmFwcGVuZCh2YXJOYW1lKTsKKwkJaWYgKHZhckFyZ3VtZW50ICE9IG51bGwgJiYgdmFyQXJndW1lbnQubGVuZ3RoKCkgPiAwKSB7CisJCQlidWZmZXIuYXBwZW5kKFZBUl9UQUdfU0VQKTsKKwkJCWJ1ZmZlci5hcHBlbmQodmFyQXJndW1lbnQpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoVkFSX1RBR19FTkQpOworCX0KKwkKKwkvKioKKwkgKiBCdWlsZHMgYSB2YXJpYWJsZSB0YWcgZm9yIGVhY2ggYXJndW1lbnQgdGhhdCB3aWxsIGJlIGF1dG8tZXhwYW5kZWQgYmVmb3JlCisJICogdGhlIHRvb2wgaXMgcnVuLgorCSAqIAorCSAqIEBwYXJhbSB2YXJOYW1lIHRoZSBuYW1lIG9mIGEga25vd24gdmFyaWFibGUgKG9uZSBvZiB0aGUgVkFSXyogY29uc3RhbnRzKQorCSAqIEBwYXJhbSB2YXJBcmd1bWVudHMgYSBsaXN0IG9mIGFyZ3VtZW50cyBmb3IgZWFjaCB2YXJpYWJsZQorCSAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byB3cml0ZSB0aGUgY29uc3RydWN0ZWQgdmFyaWFibGUgdGFncworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFZhcmlhYmxlVGFncyhTdHJpbmcgdmFyTmFtZSwgU3RyaW5nW10gdmFyQXJndW1lbnRzLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vICROT04tTkxTLTEkCisJCQlidWlsZFZhcmlhYmxlVGFnKHZhck5hbWUsIHZhckFyZ3VtZW50c1tpXSwgYnVmZmVyKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBFeHRyYWN0cyBmcm9tIHRoZSBzb3VyY2UgdGV4dCB0aGUgdmFyaWFibGUgdGFnJ3MgbmFtZQorCSAqIGFuZCBhcmd1bWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gdGV4dCB0aGUgc291cmNlIHRleHQgdG8gcGFyc2UgZm9yIGEgdmFyaWFibGUgdGFnCisJICogQHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBpbiB0aGUgc3RyaW5nIHRvIHN0YXJ0IHRoZSBzZWFyY2gKKwkgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBWYXJpYWJsZURlZmluaXRpb24gZXh0cmFjdFZhcmlhYmxlVGFnKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQpIHsKKwkJVmFyaWFibGVEZWZpbml0aW9uIHZhckRlZiA9IGluc3RhbmNlLm5ldyBWYXJpYWJsZURlZmluaXRpb24oKTsKKwkJCisJCXZhckRlZi5zdGFydCA9IHRleHQuaW5kZXhPZihWQVJfVEFHX1NUQVJULCBzdGFydCk7CisJCWlmICh2YXJEZWYuc3RhcnQgPCAwKQorCQkJcmV0dXJuIHZhckRlZjsKKwkJc3RhcnQgPSB2YXJEZWYuc3RhcnQgKyBWQVJfVEFHX1NUQVJULmxlbmd0aCgpOworCQkKKwkJaW50IGVuZCA9IHRleHQuaW5kZXhPZihWQVJfVEFHX0VORCwgc3RhcnQpOworCQlpZiAoZW5kIDwgMCkKKwkJCXJldHVybiB2YXJEZWY7CisJCXZhckRlZi5lbmQgPSBlbmQgKyBWQVJfVEFHX0VORC5sZW5ndGgoKTsKKwkJaWYgKGVuZCA9PSBzdGFydCkKKwkJCXJldHVybiB2YXJEZWY7CisJCisJCWludCBtaWQgPSB0ZXh0LmluZGV4T2YoVkFSX1RBR19TRVAsIHN0YXJ0KTsKKwkJaWYgKG1pZCA8IDAgfHwgbWlkID4gZW5kKSB7CisJCQl2YXJEZWYubmFtZSA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOworCQl9IGVsc2UgeworCQkJaWYgKG1pZCA+IHN0YXJ0KQorCQkJCXZhckRlZi5uYW1lID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIG1pZCk7CisJCQltaWQgPSBtaWQgKyBWQVJfVEFHX1NFUC5sZW5ndGgoKTsKKwkJCWlmIChtaWQgPCBlbmQpCisJCQkJdmFyRGVmLmFyZ3VtZW50ID0gdGV4dC5zdWJzdHJpbmcobWlkLCBlbmQpOworCQl9CisJCQorCQlyZXR1cm4gdmFyRGVmOworCX0KKwkKKwkvKioKKwkgKiBFeHRyYWN0cyBhbGwgYXJndW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUgdGFnIG5hbWUuCisJICogUGxhY2VzIHRoZSByZW1haW5pbmcgdGV4dCBvbiB0aGUgYnVmZmVyLgorCSAqIAorCSAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIHBhcnNlIGZvciB2YXJpYWJsZSB0YWdzIG9mIHRoZSBzcGVjaWZpZWQgbmFtZQorCSAqIEBwYXJhbSB2YXJOYW1lIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0YWcgdG8gZXh0cmFjdCBpdHMgYXJndW1lbnQKKwkgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgdGhlIHJlc3Qgb2YgdGhlIHRleHQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBmb3IgdGhlIHZhcmlhYmxlIHRhZyBuYW1lIHNwZWNpZmllZAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZXh0cmFjdFZhcmlhYmxlQXJndW1lbnRzKFN0cmluZyB0ZXh0LCBTdHJpbmcgdmFyTmFtZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKworCQlpbnQgc3RhcnQgPSAwOworCQl3aGlsZSAodHJ1ZSkgeworCQkJVmFyaWFibGVEZWZpbml0aW9uIHZhckRlZiA9IGV4dHJhY3RWYXJpYWJsZVRhZyh0ZXh0LCBzdGFydCk7CisJCQkKKwkJCWlmICh2YXJEZWYuc3RhcnQgPT0gLTEpIHsKKwkJCQlpZiAoc3RhcnQgPT0gMCkKKwkJCQkJYnVmZmVyLmFwcGVuZCh0ZXh0KTsKKwkJCQllbHNlCisJCQkJCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcoc3RhcnQpKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAodmFyRGVmLnN0YXJ0ID4gc3RhcnQpIHsKKwkJCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCB2YXJEZWYuc3RhcnQpKTsKKwkJCX0KKworCQkJaWYgKHZhckRlZi5lbmQgPT0gLTEpIHsKKwkJCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHZhckRlZi5zdGFydCkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAodmFyTmFtZS5lcXVhbHModmFyRGVmLm5hbWUpKSB7CisJCQkJaWYgKHZhckRlZi5hcmd1bWVudCAhPSBudWxsKQorCQkJCQlyZXN1bHRzLmFkZCh2YXJEZWYuYXJndW1lbnQpOworCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHZhckRlZi5zdGFydCwgdmFyRGVmLmVuZCkpOworCQkJfQorCQkJCisJCQlzdGFydCA9IHZhckRlZi5lbmQ7CisJCX0KKwkJCisJCVN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXTsKKwkJcmVzdWx0cy50b0FycmF5KGFyZ3MpOworCQlyZXR1cm4gYXJnczsKKwl9CisJCisJLyoqCisJICogQ2xlYXJzIHRoZSBsb2cgbWVzc2FnZXMgcmVjb3JkZWQgc28gZmFyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckxvZ0RvY3VtZW50KCkgeworCQlMb2dDb25zb2xlRG9jdW1lbnQuZ2V0SW5zdGFuY2UoKS5jbGVhck91dHB1dCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIGEgcmVzb3VyY2UsIGdpdmVuIGEgc3RyaW5nIG9mIHRoZSBmb3JtCisJICogVkFSX1RBR19TVEFSVCArIEV4dGVybmFsVG9vbC5WQVJfV09SS1NQQUNFX0xPQyArIFZBUl9UQUdfU0VQICsgCisJICogZnVsbCBwYXRoIG9mIGEgcmVzb3VyY2UgKyBWQVJfVEFHX0VORCwgb3IgYSBzdHJpbmcgdGhhdCBpcyBhbHJlYWR5CisJICogYSByZXNvdXJjZSBsb2NhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gY29udGVudHMgdGhlIGNvbnRlbnRzIG9mIGEgRWRpdERpYWxvZyBsb2NhdGlvbiBmaWVsZC4KKwkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UsIG9yIG51bGwgaWYgdGhlIHJlc291cmNlCisJICogaXMgbm90IGZvdW5kLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2F0aW9uRnJvbVRleHQoU3RyaW5nIGNvbnRlbnRzKSB7CisJCVZhcmlhYmxlRGVmaW5pdGlvbiB2YXJEZWYgPSBleHRyYWN0VmFyaWFibGVUYWcoY29udGVudHMsIDApOworCQlpZiAodmFyRGVmLnN0YXJ0ID49IDAgJiYgRXh0ZXJuYWxUb29sLlZBUl9XT1JLU1BBQ0VfTE9DLmVxdWFscyh2YXJEZWYubmFtZSkpCisJCQlpZiAodmFyRGVmLmFyZ3VtZW50ICE9IG51bGwgJiYgdmFyRGVmLmFyZ3VtZW50Lmxlbmd0aCgpID4gMCkgeworCQkJCXJldHVybiBnZXRMb2NhdGlvbkZyb21GdWxsUGF0aCh2YXJEZWYuYXJndW1lbnQpOwkJCQorCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyBjb250ZW50cy5zdWJzdHJpbmcodmFyRGVmLmVuZCk7CisJCQl9CisJCWVsc2UKKwkJCXJldHVybiBjb250ZW50czsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcGh5c2ljYWwgbG9jYXRpb24gb2YgYSByZXNvdXJjZSwgZ2l2ZW4gdGhlIGZ1bGwgcGF0aCBvZiB0aGUKKwkgKiByZXNvdXJjZSAod2l0aCByZXNwZWN0IHRvIHRoZSB3b3Jrc3BhY2UpLgorCSAqIAorCSAqIEBwYXJhbSBmdWxsUGF0aCB0aGUgZnVsbCBwYXRoIG9mIHRoZSByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UsIG9yIG51bGwgaWYgdGhlIHJlc291cmNlIGlzIG5vdCBmb3VuZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhdGlvbkZyb21GdWxsUGF0aChTdHJpbmcgZnVsbFBhdGgpIHsKKwkJSVJlc291cmNlIG1lbWJlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmdWxsUGF0aCk7CisJCWlmIChtZW1iZXIgIT0gbnVsbCkKKwkJCXJldHVybiBtZW1iZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7CisJCWVsc2UKKwkJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0b29sIHJ1bm5lciBmb3IgdGhlIHNwZWNpZmllZAorCSAqIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgcmVnaXN0ZXJlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4dGVybmFsVG9vbHNSdW5uZXIgZ2V0UnVubmVyKFN0cmluZyB0eXBlKSB7CisJCWlmIChFeHRlcm5hbFRvb2wuVE9PTF9UWVBFX1BST0dSQU0uZXF1YWxzKHR5cGUpKQorCQkJcmV0dXJuIG5ldyBQcm9ncmFtUnVubmVyKCk7CisJCWlmIChFeHRlcm5hbFRvb2wuVE9PTF9UWVBFX0FOVC5lcXVhbHModHlwZSkpCisJCQlyZXR1cm4gbmV3IEFudEZpbGVSdW5uZXIoKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFNhdmVzIGFueSBkaXJ0eSBlZGl0b3JzIGlmIHVzZXIgcHJlZmVyZW5jZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlRGlydHlFZGl0b3JzKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7CisJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKKwkJYm9vbGVhbiBhdXRvU2F2ZSA9IHN0b3JlLmdldEJvb2xlYW4oSVByZWZlcmVuY2VDb25zdGFudHMuQVVUT19TQVZFKTsKKwkJaWYgKGF1dG9TYXZlKSB7CisJCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKS5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7CisJCQlmb3IgKGludCBpPTA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7CisJCQkJSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhZ2VzLmxlbmd0aDsgaisrKSB7CisJCQkJCXBhZ2VzW2pdLnNhdmVBbGxFZGl0b3JzKGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogRm9yY2VzIHRoZSBsb2cgY29uc29sZSB2aWV3IHRvIG9wZW4uIFJldHVybnMgdGhlIHZpZXcKKwkgKiBwYXJ0IGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIExvZ0NvbnNvbGVWaWV3IHNob3dMb2dDb25zb2xlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7CisJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOworCQlMb2dDb25zb2xlVmlldyBjb25zb2xlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmIChwYWdlICE9IG51bGwpIHsKKwkJCQljb25zb2xlPSAoTG9nQ29uc29sZVZpZXcpcGFnZS5maW5kVmlldyhFeHRlcm5hbFRvb2xzUGx1Z2luLkxPR19DT05TT0xFX0lEKTsKKwkJCQlpZihjb25zb2xlID09IG51bGwpIHsKKwkJCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydD0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7CisJCQkJCXBhZ2Uuc2hvd1ZpZXcoRXh0ZXJuYWxUb29sc1BsdWdpbi5MT0dfQ09OU09MRV9JRCk7CisJCQkJCS8vcmVzdG9yZSBmb2N1cyBzdG9sZW4gYnkgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb25zb2xlCisJCQkJCXBhZ2UuYWN0aXZhdGUoYWN0aXZlUGFydCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGFnZS5icmluZ1RvVG9wKGNvbnNvbGUpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworCQkJRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOworCQl9CisJCXJldHVybiBjb25zb2xlOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBzdHJpbmcgY29udGFpbnMgYXQgbGVhc3Qgb25lIHNwYWNlLgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1NwYWNlKFN0cmluZyB2YXIpIHsKKwkJaW50IGluZGV4ID0gdmFyLmluZGV4T2YoJyAnKTsKKwkJaWYgKGluZGV4ID49IDApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBTdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGEgdmFyaWFibGUgZGVmaW5pdGlvbiB3aXRoaW4gYQorCSAqIHNvdXJjZSBzdHJpbmcuCisJICovCisJcHVibGljIGZpbmFsIGNsYXNzIFZhcmlhYmxlRGVmaW5pdGlvbiB7CisJCS8qKgorCQkgKiBJbmRleCBpbiB0aGUgc291cmNlIHRleHQgd2hlcmUgdGhlIHZhcmlhYmxlIHN0YXJ0ZWQKKwkJICogb3IgPGNvZGU+LTE8L2NvZGU+IGlmIG5vIHZhbGlkIHZhcmlhYmxlIHN0YXJ0IHRhZyAKKwkJICogaWRlbnRpZmllciBmb3VuZC4KKwkJICovCisJCXB1YmxpYyBpbnQgc3RhcnQgPSAtMTsKKwkJCisJCS8qKgorCQkgKiBJbmRleCBpbiB0aGUgc291cmNlIHRleHQgb2YgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcKKwkJICogdGhlIGVuZCBvZiB0aGUgdmFyaWFibGUgb3IgPGNvZGU+LTE8L2NvZGU+IGlmIG5vIAorCQkgKiB2YWxpZCB2YXJpYWJsZSBlbmQgdGFnIGZvdW5kLgorCQkgKi8KKwkJcHVibGljIGludCBlbmQgPSAtMTsKKwkJCisJCS8qKgorCQkgKiBUaGUgdmFyaWFibGUncyBuYW1lIGZvdW5kIGluIHRoZSBzb3VyY2UgdGV4dCwgb3IKKwkJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmFsaWQgdmFyaWFibGUgZm91bmQuCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIG5hbWUgPSBudWxsOworCQkKKwkJLyoqCisJCSAqIFRoZSB2YXJpYWJsZSdzIGFyZ3VtZW50IGZvdW5kIGluIHRoZSBzb3VyY2UgdGV4dCwgb3IKKwkJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmFsaWQgdmFyaWFibGUgZm91bmQgb3IgaWYKKwkJICogdGhlIHZhcmlhYmxlIGRpZCBub3Qgc3BlY2lmeSBhbiBhcmd1bWVudAorCQkgKi8KKwkJcHVibGljIFN0cmluZyBhcmd1bWVudCA9IG51bGw7CisJCQorCQkvKioKKwkJICogQ3JlYXRlIGFuIGluaXRpYWxpemVkIHZhcmlhYmxlIGRlZmluaXRpb24uCisJCSAqLworCQlwcml2YXRlIFZhcmlhYmxlRGVmaW5pdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBDcmVhdGUgYW4gaW5pdGlhbGl6ZWQgdmFyaWFibGUgZGVmaW5pdGlvbi4KKwkJICovCisJCXByaXZhdGUgVmFyaWFibGVEZWZpbml0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMuc3RhcnQgPSBzdGFydDsKKwkJCXRoaXMuZW5kID0gZW5kOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiNDIwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMTUgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FudENsYXNzcGF0aFBhZ2UuYWRkRm9sZGVyQnV0dG9uVGl0bGUgPSBBZGQgJkZvbGRlci4uLgorQW50Q2xhc3NwYXRoUGFnZS5hZGRKYXJCdXR0b25UaXRsZSA9IEFkZCAmSkFScy4uLgorQW50Q2xhc3NwYXRoUGFnZS51cEJ1dHRvblRpdGxlID0gJlVwCitBbnRDbGFzc3BhdGhQYWdlLmRvd25CdXR0b25UaXRsZSA9IERvJnduCitBbnRDbGFzc3BhdGhQYWdlLnJlbW92ZUJ1dHRvblRpdGxlID0gJlJlbW92ZQorQW50Q2xhc3NwYXRoUGFnZS50aXRsZSA9IEMmbGFzc3BhdGgKKworQ29uZmlndXJhdGlvbkRpYWxvZy5zaGVsbFRpdGxlID0gRXh0ZXJuYWwgVG9vbHMgQ29uZmlndXJhdGlvbgorQ29uZmlndXJhdGlvbkRpYWxvZy5kaWFsb2dUaXRsZSA9IEV4dGVybmFsIFRvb2xzCitDb25maWd1cmF0aW9uRGlhbG9nLmRpYWxvZ01lc3NhZ2UgPSBDb25maWd1cmUgYW4gZXh0ZXJuYWwgdG9vbCB0byBydW4gYSBwcm9ncmFtLCBiYXRjaCBmaWxlLCBvciBBbnQgYnVpbGQgZmlsZS4KK0NvbmZpZ3VyYXRpb25EaWFsb2cudG9vbExpc3QgPSAmVG9vbHM6CitDb25maWd1cmF0aW9uRGlhbG9nLm5ld0J1dHRvbiA9ICZOZXcuLi4KK0NvbmZpZ3VyYXRpb25EaWFsb2cuZWRpdEJ1dHRvbiA9ICZFZGl0Li4uCitDb25maWd1cmF0aW9uRGlhbG9nLnJlbW92ZUJ1dHRvbiA9ICZSZW1vdmUKK0NvbmZpZ3VyYXRpb25EaWFsb2cudXBCdXR0b24gPSAmVXAKK0NvbmZpZ3VyYXRpb25EaWFsb2cuZG93bkJ1dHRvbiA9ICZEb3duCitDb25maWd1cmF0aW9uRGlhbG9nLmRldGFpbHMgPSBEZXQmYWlsczoKK0NvbmZpZ3VyYXRpb25EaWFsb2cuZGV0YWlsTWVzc2FnZSA9IExvY2F0aW9uOiB7MH1cbkFyZ3VtZW50czogezF9XG5EaXJlY3Rvcnk6IHsyfQorCitFZGl0RGlhbG9nLm5ld1NoZWxsVGl0bGUgPSBOZXcgRXh0ZXJuYWwgVG9vbAorRWRpdERpYWxvZy5lZGl0U2hlbGxUaXRsZSA9IEVkaXQgRXh0ZXJuYWwgVG9vbAorRWRpdERpYWxvZy5kaWFsb2dUaXRsZSA9IEV4dGVybmFsIFRvb2wKK0VkaXREaWFsb2cubmV3RGlhbG9nTWVzc2FnZSA9IENyZWF0ZSBhbiBleHRlcm5hbCB0b29sIHRvIHJ1biBhIHByb2dyYW0sIGJhdGNoIGZpbGUsIG9yIEFudCBidWlsZCBmaWxlLgorRWRpdERpYWxvZy5lZGl0RGlhbG9nTWVzc2FnZSA9IEVkaXQgYW4gZXh0ZXJuYWwgdG9vbCB0byBydW4gYSBwcm9ncmFtLCBiYXRjaCBmaWxlLCBvciBBbnQgYnVpbGQgZmlsZS4KK0VkaXREaWFsb2cuaG93VG9TZWxlY3RBbnRUYXJnZXRzID0gVG8gY2hvb3NlIEFudCB0YXJnZXRzLCBwcmVzcyB0aGUgJydCcm93c2UgVmFyaWFibGVzJycgYnV0dG9uIGFuZCBzZWxlY3QgJydBbnQgdGFyZ2V0cycnLgorRWRpdERpYWxvZy5uYW1lTGFiZWwgPSAmTmFtZToKK0VkaXREaWFsb2cubG9jYXRpb25MYWJlbCA9IFRvb2wgJkxvY2F0aW9uOgorRWRpdERpYWxvZy5hcmd1bWVudExhYmVsID0gVG9vbCAmQXJndW1lbnRzOgorRWRpdERpYWxvZy5kaXJMYWJlbCA9IFdvcmtpbmcgJkRpcmVjdG9yeToKK0VkaXREaWFsb2cucmVmcmVzaE9wdGlvbiA9IEFmdGVyIHJ1bm5pbmcsICZyZWZyZXNoOgorRWRpdERpYWxvZy5icm93c2VXa3NwQnV0dG9uMSA9IEJyb3dzZSAmV29ya3NwYWNlLi4uCitFZGl0RGlhbG9nLmJyb3dzZUZpbGVTeXNCdXR0b24xID0gQnJvd3NlICZGaWxlIFN5c3RlbS4uLgorRWRpdERpYWxvZy5icm93c2VWYXJzQnV0dG9uID0gQnJvd3NlICZWYXJpYWJsZXMuLi4KK0VkaXREaWFsb2cuZGlyZWN0b3J5QnJvd3NlQnV0dG9uID0gQnJvd3NlICZPcHRpb25zLi4uCitFZGl0RGlhbG9nLnJlZnJlc2hPcHRpb25CdXR0b24gPSBCcm93c2UgTyZwdGlvbnMuLi4KK0VkaXREaWFsb2cuYnJvd3NlV29ya3NwYWNlVGl0bGUgPSBCcm93c2UgV29ya3NwYWNlCitFZGl0RGlhbG9nLnNlbGVjdFRvb2wgPSAmU2VsZWN0IHRoZSBleHRlcm5hbCB0b29sIHRvIHVzZToKK0VkaXREaWFsb2cuc2VsZWN0UmVzb3VyY2UgPSAmU2VsZWN0IHRoZSByZXNvdXJjZSB0byB1c2U6CitFZGl0RGlhbG9nLnNlbGVjdENvbnRhaW5lciA9ICZTZWxlY3QgdGhlIGNvbnRhaW5lciB0byB1c2U6CitFZGl0RGlhbG9nLnNlbGVjdERpcmVjdG9yeSA9ICZTZWxlY3QgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHVzZToKK0VkaXREaWFsb2cuc2VsZWN0VGFyZ2V0cyA9ICZTZWxlY3QgdGhlIEFudCB0YXJnZXRzIHRvIHVzZToKK0VkaXREaWFsb2cuc2VsZWN0Rm9sZGVyID0gJlNlbGVjdCB0aGUgZm9sZGVyIHRvIHVzZToKK0VkaXREaWFsb2cuYnJvd3NlVmFyVGl0bGUgPSBCcm93c2UgVmFyaWFibGVzCitFZGl0RGlhbG9nLmJyb3dzZURpclRpdGxlID0gQnJvd3NlIFdvcmtpbmcgRGlyZWN0b3J5IE9wdGlvbnMKK0VkaXREaWFsb2cuc2VsZWN0VmFyID0gJlNlbGVjdCBhIHZhcmlhYmxlIHRvIHVzZToKK0VkaXREaWFsb2cuc2VsZWN0RGlyID0gJlNlbGVjdCBhIHdvcmtpbmcgZGlyZWN0b3J5IG9wdGlvbjoKK0VkaXREaWFsb2cuZGlyQnJvd3NlV29ya3NwYWNlID0gQnJvd3NlIHdvcmtzcGFjZQorRWRpdERpYWxvZy5kaXJCcm93c2VGaWxlU3lzdGVtID0gQnJvd3NlIGZpbGUgc3lzdGVtCitFZGl0RGlhbG9nLnZhcldvcmtzcGFjZUxvY0xhYmVsID0gV29ya3NwYWNlIGxvY2F0aW9uCitFZGl0RGlhbG9nLnZhclByb2plY3RMb2NMYWJlbCA9IFNlbGVjdGVkIHJlc291cmNlJ3MgcHJvamVjdCBsb2NhdGlvbgorRWRpdERpYWxvZy52YXJDb250YWluZXJMb2NMYWJlbCA9IFNlbGVjdGVkIHJlc291cmNlJ3MgY29udGFpbmVyIGxvY2F0aW9uCitFZGl0RGlhbG9nLnZhclJlc291cmNlTG9jTGFiZWwgPSBTZWxlY3RlZCByZXNvdXJjZSBsb2NhdGlvbgorRWRpdERpYWxvZy52YXJQcm9qZWN0UGF0aExhYmVsID0gU2VsZWN0ZWQgcmVzb3VyY2UncyBwcm9qZWN0IGZ1bGwgcGF0aAorRWRpdERpYWxvZy52YXJDb250YWluZXJQYXRoTGFiZWwgPSBTZWxlY3RlZCByZXNvdXJjZSdzIGNvbnRhaW5lciBmdWxsIHBhdGgKK0VkaXREaWFsb2cudmFyUmVzb3VyY2VQYXRoTGFiZWwgPSBTZWxlY3RlZCByZXNvdXJjZSBmdWxsIHBhdGgKK0VkaXREaWFsb2cudmFyUHJvamVjdE5hbWVMYWJlbCA9IFNlbGVjdGVkIHJlc291cmNlJ3MgcHJvamVjdCBuYW1lCitFZGl0RGlhbG9nLnZhckNvbnRhaW5lck5hbWVMYWJlbCA9IFNlbGVjdGVkIHJlc291cmNlJ3MgY29udGFpbmVyIG5hbWUKK0VkaXREaWFsb2cudmFyUmVzb3VyY2VOYW1lTGFiZWwgPSBTZWxlY3RlZCByZXNvdXJjZSBuYW1lCitFZGl0RGlhbG9nLnZhclByb2plY3RYTG9jTGFiZWwgPSBTcGVjaWZpYyByZXNvdXJjZSdzIHByb2plY3QgbG9jYXRpb24KK0VkaXREaWFsb2cudmFyQ29udGFpbmVyWExvY0xhYmVsID0gU3BlY2lmaWMgcmVzb3VyY2UncyBjb250YWluZXIgbG9jYXRpb24KK0VkaXREaWFsb2cudmFyUmVzb3VyY2VYTG9jTGFiZWwgPSBTcGVjaWZpYyByZXNvdXJjZSBsb2NhdGlvbgorRWRpdERpYWxvZy52YXJQcm9qZWN0WFBhdGhMYWJlbCA9IFNwZWNpZmljIHJlc291cmNlJ3MgcHJvamVjdCBmdWxsIHBhdGgKK0VkaXREaWFsb2cudmFyQ29udGFpbmVyWFBhdGhMYWJlbCA9IFNwZWNpZmljIHJlc291cmNlJ3MgY29udGFpbmVyIGZ1bGwgcGF0aAorRWRpdERpYWxvZy52YXJSZXNvdXJjZVhQYXRoTGFiZWwgPSBTcGVjaWZpYyByZXNvdXJjZSBmdWxsIHBhdGgKK0VkaXREaWFsb2cudmFyUHJvamVjdFhOYW1lTGFiZWwgPSBTcGVjaWZpYyByZXNvdXJjZSdzIHByb2plY3QgbmFtZQorRWRpdERpYWxvZy52YXJDb250YWluZXJYTmFtZUxhYmVsID0gU3BlY2lmaWMgcmVzb3VyY2UncyBjb250YWluZXIgbmFtZQorRWRpdERpYWxvZy52YXJSZXNvdXJjZVhOYW1lTGFiZWwgPSBTcGVjaWZpYyByZXNvdXJjZSBuYW1lCitFZGl0RGlhbG9nLnZhckJ1aWxkVHlwZU5hbWVMYWJlbCA9IEJ1aWxkIHR5cGUKK0VkaXREaWFsb2cudmFyQW50VGFyZ2V0TGFiZWwgPSBBbnQgdGFyZ2V0cworRWRpdERpYWxvZy5icm93c2VQcm9qZWN0VGl0bGUgPSBCcm93c2UgUHJvamVjdHMKK0VkaXREaWFsb2cuc2VsZWN0UHJvamVjdCA9ICZTZWxlY3QgYSBwcm9qZWN0IHRvIHVzZToKK0VkaXREaWFsb2cubm9Ub29sTmFtZSA9IEVudGVyIGEgbmFtZSBmb3IgdGhlIHRvb2wKK0VkaXREaWFsb2cubm9Ub29sTG9jYXRpb24gPSBFbnRlciBhIGxvY2F0aW9uIGZvciB0aGUgdG9vbAorRWRpdERpYWxvZy5taXNzaW5nVG9vbExvY2F0aW9uID0gVG9vbCBsb2NhdGlvbiBkb2VzIG5vdCBleGlzdCBvciBpcyBpbnZhbGlkCitFZGl0RGlhbG9nLm1pc3NpbmdUb29sRGlyZWN0b3J5ID0gVG9vbCB3b3JraW5nIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBvciBpcyBpbnZhbGlkCitFZGl0RGlhbG9nLnJlZnJlc2hTY29wZU5vbmUgPSBOb3RoaW5nCitFZGl0RGlhbG9nLnJlZnJlc2hTY29wZVdvcmtzcGFjZSA9IFdvcmtzcGFjZQorRWRpdERpYWxvZy5yZWZyZXNoU2NvcGVQcm9qZWN0ID0gQ3VycmVudCBwcm9qZWN0CitFZGl0RGlhbG9nLnJlZnJlc2hTY29wZVByb2plY3RYID0gUHJvamVjdCBuYW1lZCB7MH0KK0VkaXREaWFsb2cucmVmcmVzaFNjb3BlV29ya2luZ1NldCA9IFdvcmtpbmcgc2V0IG5hbWVkIHswfQorRWRpdERpYWxvZy5icm93c2VSZWZyZXNoVGl0bGUgPSBCcm93c2UgUmVmcmVzaCBTY29wZXMKK0VkaXREaWFsb2cuc2VsZWN0UmVmcmVzaCA9ICZTZWxlY3QgdGhlIHJlZnJlc2ggc2NvcGUgdG8gdXNlOgorRWRpdERpYWxvZy5yZWZyZXNoTm90aGluZ0xhYmVsID0gTm90aGluZworRWRpdERpYWxvZy5yZWZyZXNoV29ya3NwYWNlTGFiZWwgPSBDdXJyZW50IHdvcmtzcGFjZQorRWRpdERpYWxvZy5yZWZyZXNoUHJvamVjdExhYmVsID0gQ3VycmVudCBwcm9qZWN0CitFZGl0RGlhbG9nLnJlZnJlc2hQcm9qZWN0WExhYmVsID0gU3BlY2lmaWMgcHJvamVjdAorRWRpdERpYWxvZy5yZWZyZXNoV29ya2luZ1NldExhYmVsID0gU3BlY2lmaWMgd29ya2luZyBzZXQKK0VkaXREaWFsb2cuc2hvd0xvZ0xhYmVsID0gUyZob3cgZXhlY3V0aW9uIGxvZyBvbiBjb25zb2xlCitFZGl0RGlhbG9nLmVycm9yVGl0bGUgPSBFZGl0IEV4dGVybmFsIFRvb2wgUHJvYmxlbQorRWRpdERpYWxvZy5lcnJvclJlYWRBbnRGaWxlID0gUHJvYmxlbXMgcmVhZGluZyBBbnQgYnVpbGQgZmlsZTogezB9CitFZGl0RGlhbG9nLm5vQW50VGFyZ2V0cyA9IENvdWxkIG5vdCBmaW5kIGFueSB0YXJnZXRzIGluIEFudCBidWlsZCBmaWxlOiB7MH0KKworRXh0ZXJuYWxUb29sc1JlZ2lzdHJ5LnNhdmVTdGF0ZUVycm9yVGl0bGUgPSBQcm9ibGVtIFNhdmluZyBFeHRlcm5hbCBUb29sCitFeHRlcm5hbFRvb2xzUmVnaXN0cnkuc2F2ZVN0YXRlRXJyb3IgPSBDb3VsZCBub3Qgd3JpdGUgZXh0ZXJuYWwgdG9vbCBjb25maWd1cmF0aW9ucyB0byBkaXNrLlxuXG5QbGVhc2UgdHJ5IGFnYWluLgorCitCdWlsZGVyUHJvcGVydHlQYWdlLmRlc2NyaXB0aW9uID0gQWRkIGV4dGVybmFsIHRvb2xzIHRvIHRoZSBidWlsZCBvcmRlci4KK0J1aWxkZXJQcm9wZXJ0eVBhZ2UubmV3QnV0dG9uID0gJk5ldy4uLgorQnVpbGRlclByb3BlcnR5UGFnZS5lZGl0QnV0dG9uID0gJkVkaXQuLi4KK0J1aWxkZXJQcm9wZXJ0eVBhZ2UucmVtb3ZlQnV0dG9uID0gJlJlbW92ZQorQnVpbGRlclByb3BlcnR5UGFnZS51cEJ1dHRvbiA9ICZVcAorQnVpbGRlclByb3BlcnR5UGFnZS5kb3duQnV0dG9uID0gJkRvd24KK0J1aWxkZXJQcm9wZXJ0eVBhZ2Uuc3RhdHVzTWVzc2FnZSA9IEludGVybmFsIGVycm9yCitCdWlsZGVyUHJvcGVydHlQYWdlLmVycm9yVGl0bGUgPSBFeHRlcm5hbCBUb29sIEJ1aWxkZXIgUHJvYmxlbQorQnVpbGRlclByb3BlcnR5UGFnZS5lcnJvck1lc3NhZ2UgPSBJbnRlcm5hbCBlcnJvcgorQnVpbGRlclByb3BlcnR5UGFnZS5pbnZhbGlkQnVpbGRUb29sID0gSW52YWxpZCBFeHRlcm5hbCBUb29sIEJ1aWxkZXIKK0J1aWxkZXJQcm9wZXJ0eVBhZ2UubWlzc2luZ0J1aWxkZXIgPSBNaXNzaW5nIGJ1aWxkZXIgKHswfSkKKworRGVmYXVsdFJ1bm5lckNvbnRleHQucnVubmluZ0V4dGVybmFsVG9vbCA9IFJ1bm5pbmcgZXh0ZXJuYWwgdG9vbC4uLgorRGVmYXVsdFJ1bm5lckNvbnRleHQuaW52YWxpZExvY2F0aW9uID0gVGhlIHRvb2wnJ3MgZmlsZSBkb2VzIG5vdCBleGlzdCBmb3IgdGhlIGV4dGVybmFsIHRvb2wgbmFtZWQgezB9LgorRGVmYXVsdFJ1bm5lckNvbnRleHQuaW52YWxpZERpcmVjdG9yeSA9IFRoZSB0b29sJydzIHdvcmtpbmcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGZvciB0aGUgZXh0ZXJuYWwgdG9vbCBuYW1lZCB7MH0uCitEZWZhdWx0UnVubmVyQ29udGV4dC5yZWZyZXNoV29ya2luZ1NldCA9IFJlZnJlc2hpbmcuLi4KK0RlZmF1bHRSdW5uZXJDb250ZXh0LmVycm9yU2hlbGxUaXRsZSA9IFByb2JsZW0gUnVubmluZyBFeHRlcm5hbCBUb29sCitEZWZhdWx0UnVubmVyQ29udGV4dC5lcnJvck1lc3NhZ2UgPSBFeHRlcm5hbCB0b29sIGZhaWxlZCB0byBydW4uCisKK0V4dGVybmFsVG9vbHNSdW5uZXIucnVubmluZ1Rvb2xMYWJlbCA9IFJ1bm5pbmcgZXh0ZXJuYWwgdG9vbDogezB9CitFeHRlcm5hbFRvb2xzUnVubmVyLmludGVybmFsRXJyb3JNZXNzYWdlID0gSW50ZXJuYWwgZXJyb3IKKworRXh0ZXJuYWxUb29sc0FjdGlvbi5ydW5Qcm9ibGVtID0gQSBwcm9ibGVtIG9jY3VycmVkIHJ1bm5pbmcgdGhlIGV4dGVybmFsIHRvb2wuIFNlZSB0aGUgbG9nIGNvbnNvbGUgZm9yIGRldGFpbHMuCitFeHRlcm5hbFRvb2xzQWN0aW9uLnJ1bkVycm9yVGl0bGUgPSBSdW4gVG9vbCBQcm9ibGVtCitFeHRlcm5hbFRvb2xzQWN0aW9uLmludGVybmFsRXJyb3IgPSBFeHRlcm5hbCB0b29sIHJ1bm5lciBpbnRlcm5hbCBlcnJvcgorRXh0ZXJuYWxUb29sc0FjdGlvbi5jb25maWd1cmUgPSAmQ29uZmlndXJlLi4uCisKK0xvZ0NvbnNvbGVEb2N1bWVudC5leHRlcm5hbFRvb2wgPSBFeHRlcm5hbCBUb29sCisKK0xvZ0NvbnNvbGVWaWV3LmNvcHkgPSAmQ29weUBDdHJsK0MKK0xvZ0NvbnNvbGVWaWV3LmV4cGFuZEFsbCA9ICZFeHBhbmQgQWxsCitMb2dDb25zb2xlVmlldy5zZWxlY3RBbGwgPSBTZWxlY3QgJkFsbEBDdHJsK0EKK0xvZ0NvbnNvbGVWaWV3LmNsZWFyT3V0cHV0ID0gQ2xlYXIgT3V0cHV0CitMb2dDb25zb2xlVmlldy5oaWRlT3V0cHV0U3RydWN0dXJlVHJlZSA9IEhpZGUgT3V0cHV0IFN0cnVjdHVyZSBUcmVlCitMb2dDb25zb2xlVmlldy5zaG93T3V0cHV0U3RydWN0dXJlVHJlZSA9IFNob3cgT3V0cHV0IFN0cnVjdHVyZSBUcmVlCitMb2dDb25zb2xlVmlldy5zaG93VHJlZSA9ICZTaG93IFRyZWUKK0xvZ0NvbnNvbGVWaWV3LnNob3dTZWxlY3RlZEVsZW1lbnRPbmx5ID0gU2hvdyBPdXRwdXQgb2YgU2VsZWN0ZWQgRWxlbWVudCBPbmx5CitMb2dDb25zb2xlVmlldy5zaG93Q29tcGxldGVPdXRwdXQgPSBTaG93IENvbXBsZXRlIE91dHB1dAorTG9nQ29uc29sZVZpZXcuZmluZEFjdGlvbi5sYWJlbCA9IEZpbmQvUmVwbGFjZQorCitMb2dUcmVlTGFiZWxQcm92aWRlci5pbnZhbGlkSXRlbU5hbWUgPSBJbnZhbGlkIGl0ZW0gbmFtZQorCitUb29sc1ByZWZlcmVuY2VQYWdlLmVycm9yQ29sb3IgPSAmRXJyb3I6CitUb29sc1ByZWZlcmVuY2VQYWdlLndhcm5pbmdDb2xvciA9ICZXYXJuaW5nOgorVG9vbHNQcmVmZXJlbmNlUGFnZS5pbmZvQ29sb3IgPSBJJm5mb3JtYXRpb246CitUb29sc1ByZWZlcmVuY2VQYWdlLnZlcmJvc2VDb2xvciA9IFZlJnJib3NlOgorVG9vbHNQcmVmZXJlbmNlUGFnZS5kZWJ1Z0NvbG9yID0gRGViJnVnOgorVG9vbHNQcmVmZXJlbmNlUGFnZS5mb250ID0gQ29uc29sZSBmb250IHNldHRpbmc6CitUb29sc1ByZWZlcmVuY2VQYWdlLmRlc2NyaXB0aW9uID0gQ29uc29sZSB0ZXh0IGNvbG9yIHNldHRpbmdzLgorVG9vbHNQcmVmZXJlbmNlUGFnZS5zYXZlUHJpb3JUb0J1aWxkaW5nID0gJlNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBiZWZvcmUgcnVubmluZyBhbiBleHRlcm5hbCB0b29sCitUb29sc1ByZWZlcmVuY2VQYWdlLnByZWZlcmVkT3V0cHV0TGV2ZWwgPSBQcmVmZXJyZWQgb3V0cHV0IGxldmVsCitUb29sc1ByZWZlcmVuY2VQYWdlLmluZm8gPSAmSW5mb3JtYXRpb24gKG5vcm1hbCkKK1Rvb2xzUHJlZmVyZW5jZVBhZ2UudmVyYm9zZSA9ICZWZXJib3NlCitUb29sc1ByZWZlcmVuY2VQYWdlLmRlYnVnID0gRGUmYnVnCisKK0J1aWxkQ2FuY2VsZWRFeGNlcHRpb24uY2FuY2VsZWQgPSBDYW5jZWxlZAorCitBbnRVdGlsLmFudEZpbGVOb3RGb3VuZCA9IENvdWxkIG5vdCBvcGVuIEFudCBidWlsZCBmaWxlLgorQW50VXRpbC5wYXJzZXJDb25maWdFcnJvciA9IEludGVybmFsIHBhcnNlciBjb25maWd1cmF0aW9uIGVycm9yLgorQW50VXRpbC5pb0Vycm9yID0gQ291bGQgbm90IHJlYWQgY29udGVudCBvZiBBbnQgYnVpbGQgZmlsZS4KK0FudFV0aWwuZm9ybWF0RXJyb3IgPSBDb3VsZCBub3QgcGFyc2UgY29udGVudCBvZiBBbnQgYnVpbGQgZmlsZS4KK0FudFV0aWwuaW52YWxpZEFudEJ1aWxkRmlsZSA9IEludmFsaWQgY29udGVudCBmb3JtYXQgb2YgQW50IGJ1aWxkIGZpbGUuCisKK0FudEFjdGlvbi5ydW5FcnJvclRpdGxlID0gUnVuIEFudCBQcm9ibGVtCitBbnRBY3Rpb24uZXJyb3JSZWFkQW50RmlsZSA9IFByb2JsZW1zIHJlYWRpbmcgQW50IGJ1aWxkIGZpbGU6IHswfQorQW50QWN0aW9uLm5vQW50VGFyZ2V0cyA9IENvdWxkIG5vdCBmaW5kIGFueSB0YXJnZXRzIGluIEFudCBidWlsZCBmaWxlOiB7MH0KKworQW50TGF1bmNoV2l6YXJkLnNoZWxsVGl0bGUgPSBSdW4gQW50CitBbnRMYXVuY2hXaXphcmQuZGlhbG9nVGl0bGUgPSBSdW4KK0FudExhdW5jaFdpemFyZC5kaWFsb2dEZXNjcmlwdGlvbiA9IFJ1biBhbiBBbnQgYnVpbGQgZmlsZQorQW50TGF1bmNoV2l6YXJkLnJ1bm5pbmdBbnQgPSBSdW5uaW5nIEFudAorQW50TGF1bmNoV2l6YXJkLnJ1bkFudFByb2JsZW0gPSBBIHByb2JsZW0gb2NjdXJyZWQgZXhlY3V0aW5nIHRoZSBBbnQgZmlsZS4gU2VlIHRoZSBsb2cgY29uc29sZSBmb3IgZGV0YWlscy4KK0FudExhdW5jaFdpemFyZC5ydW5FcnJvclRpdGxlID0gUnVuIEFudCBQcm9ibGVtCitBbnRMYXVuY2hXaXphcmQuaW50ZXJuYWxBbnRFcnJvciA9IEFudCBydW5uZXIgaW50ZXJuYWwgZXJyb3IKKworQW50TGF1bmNoV2l6YXJkUGFnZS50YXJnZXRMYWJlbCA9IEF2YWlsYWJsZSAmdGFyZ2V0czoKK0FudExhdW5jaFdpemFyZFBhZ2UuYXJnc0xhYmVsID0gJkFyZ3VtZW50czoKK0FudExhdW5jaFdpemFyZFBhZ2Uuc2hvd0xvZ0xhYmVsID0gUyZob3cgZXhlY3V0aW9uIGxvZyBpbiBjb25zb2xlCisKK0FudFRhcmdldExhYmVsUHJvdmlkZXIuZGVmYXVsdFRhcmdldCA9IERlZmF1bHQKKworTnVsbEJ1aWxkTG9nZ2VyLmJ1aWxkRXhjZXB0aW9uID0gQlVJTEQgRkFJTEVEOiB7MH0KKworQWRkQ3VzdG9tRGlhbG9nLm5hbWUgPSAmTmFtZToKK0FkZEN1c3RvbURpYWxvZy5jbGFzcyA9ICZDbGFzczoKK0FkZEN1c3RvbURpYWxvZy5saWJyYXJ5ID0gJkxpYnJhcnk6CisKK0FudFRhc2tzUGFnZS5hZGRUYXNrQnV0dG9uVGl0bGUgPSBBZGQgJlRhc2suLi4KK0FudFRhc2tzUGFnZS5lZGl0VGFza0J1dHRvblRpdGxlID0gJkVkaXQgVGFzay4uLgorQW50VGFza3NQYWdlLnJlbW92ZUJ1dHRvblRpdGxlID0gJlJlbW92ZQorQW50VGFza3NQYWdlLmFkZFRhc2tEaWFsb2dEZXNjcmlwdGlvbiA9IEVudGVyIGEgbmFtZSwgSmF2YSBjbGFzcywgYW5kIGxpYnJhcnkgZm9yIHlvdXIgY3VzdG9tIHRhc2s6CitBbnRUYXNrc1BhZ2UuYWRkVGFza0RpYWxvZ1RpdGxlID0gQWRkIFRhc2sKK0FudFRhc2tzUGFnZS50aXRsZSA9IFRhJnNrcworQW50VGFza3NQYWdlLmVkaXRUYXNrRGlhbG9nRGVzY3JpcHRpb24gPSBNb2RpZnkgdGhlIG5hbWUsIEphdmEgY2xhc3MsIGFuZCBsaWJyYXJ5IG9mIHlvdXIgY3VzdG9tIHRhc2sKK0FudFRhc2tzUGFnZS5lZGl0VGFza0RpYWxvZ1RpdGxlID0gRWRpdCBUYXNrCisKK0FudFR5cGVzUGFnZS5yZW1vdmVCdXR0b25UaXRsZSA9ICZSZW1vdmUKK0FudFR5cGVzUGFnZS5hZGRUeXBlQnV0dG9uVGl0bGUgPSBBZGQgJlR5cGUuLi4KK0FudFR5cGVzUGFnZS5lZGl0VHlwZUJ1dHRvblRpdGxlID0gJkVkaXQgVHlwZS4uLgorQW50VHlwZXNQYWdlLnR5cGVzUGFnZVRpdGxlID0gVCZ5cGVzCitBbnRUeXBlc1BhZ2UuYWRkVHlwZURpYWxvZ0Rlc2NyaXB0aW9uID0gRW50ZXIgYSBuYW1lLCBKYXZhIGNsYXNzLCBhbmQgbGlicmFyeSBmb3IgeW91ciBjdXN0b20gdHlwZToKK0FudFR5cGVzUGFnZS5hZGRUeXBlRGlhbG9nVGl0bGUgPSBBZGQgVHlwZQorQW50VHlwZXNQYWdlLmVkaXRUeXBlRGlhbG9nRGVzY3JpcHRpb24gPSBNb2RpZnkgdGhlIG5hbWUsIEphdmEgY2xhc3MsIGFuZCBsaWJyYXJ5IG9mIHlvdXIgY3VzdG9tIHR5cGUKK0FudFR5cGVzUGFnZS5lZGl0VHlwZURpYWxvZ1RpdGxlID0gRWRpdCBUeXBlCisKK0FudFByZWZlcmVuY2VQYWdlLmRlc2NyaXB0aW9uID0gJkN1c3RvbWl6ZSB0aGUgY2xhc3NwYXRoLCB0YXNrcyBhbmQgdHlwZXMgdXNlZCB3aGVuIHJ1bm5pbmcgQW50IGZpbGVzIGZyb20gRWNsaXBzZS4KKworQW50SW5wdXRIYW5kbGVyLkFudF9JbnB1dF9SZXF1ZXN0XzE9QW50IElucHV0IFJlcXVlc3QKK0FudElucHV0SGFuZGxlci5JbnZhbGlkX2lucHV0XzI9SW52YWxpZCBpbnB1dAorQW50SW5wdXRIYW5kbGVyLlVuYWJsZV9hYmxlX3RvX3Jlc3BvbmRfdG9fPGlucHV0Pl9yZXF1ZXN0XzQ9VW5hYmxlIGFibGUgdG8gcmVzcG9uZCB0byA8aW5wdXQ+IHJlcXVlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BZGRDdXN0b21EaWFsb2cuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BZGRDdXN0b21EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThlZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FkZEN1c3RvbURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitUaGlzIGZpbGUgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS5Ub29sTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOworCisvKioKKyAqIERpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgdG8gYWRkIGEgY3VzdG9tIEFudCB0YXNrIG9yIHR5cGUuCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRDdXN0b21EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworCXByaXZhdGUgU3RyaW5nIHRpdGxlOworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJLy90YXNrL3R5cGUgYXR0cmlidXRlcworCXByaXZhdGUgU3RyaW5nIHRhc2tOYW1lOworCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKwlwcml2YXRlIFVSTCBsaWJyYXJ5OworCisJLy93aWRnZXRzCisJcHJpdmF0ZSBCdXR0b24gb2tCdXR0b247CisJcHJpdmF0ZSBUZXh0IG5hbWVGaWVsZDsKKwlwcml2YXRlIFRleHQgY2xhc3NGaWVsZDsKKwlwcml2YXRlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgbGlicmFyeUZpZWxkOworCisJcHJpdmF0ZSBMaXN0IGxpYnJhcnlVcmxzOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBkaWFsb2cgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYW5kIHRpdGxlLgorCSAqLworCXByb3RlY3RlZCBBZGRDdXN0b21EaWFsb2coU2hlbGwgcGFyZW50LCBMaXN0IGxpYnJhcnlVcmxzLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnRpdGxlID0gdGl0bGU7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJdGhpcy5saWJyYXJ5VXJscz0gbGlicmFyeVVybHM7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7CisJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKKwkJbmV3U2hlbGwuc2V0VGV4dCh0aXRsZSk7CisJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChuZXdTaGVsbCwgSUhlbHBDb250ZXh0SWRzLkFERF9UQVNLX0RJQUxPRyk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKKwkJCXBhcmVudCwKKwkJCUlEaWFsb2dDb25zdGFudHMuT0tfSUQsCisJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAorCQkJdHJ1ZSk7CisJCWNyZWF0ZUJ1dHRvbigKKwkJCXBhcmVudCwKKwkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAorCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsCisJCQlmYWxzZSk7CisJCXVwZGF0ZUVuYWJsZW1lbnQoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKKwkJZGlhbG9nQXJlYS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoZGVzY3JpcHRpb24pOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCWxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBZGRDdXN0b21EaWFsb2cubmFtZSIpKTsgLy8kTk9OLU5MUy0xJDsKKwkJbmFtZUZpZWxkID0gbmV3IFRleHQoZGlhbG9nQXJlYSwgU1dULkJPUkRFUik7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIOworCQluYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJbmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCXVwZGF0ZUVuYWJsZW1lbnQoKTsKKwkJCX0KKwkJfSk7CisKKwkJbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkFkZEN1c3RvbURpYWxvZy5jbGFzcyIpKTsgLy8kTk9OLU5MUy0xJDsKKwkJY2xhc3NGaWVsZCA9IG5ldyBUZXh0KGRpYWxvZ0FyZWEsIFNXVC5CT1JERVIpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWRhdGEud2lkdGhIaW50ID0gSURpYWxvZ0NvbnN0YW50cy5FTlRSWV9GSUVMRF9XSURUSDsKKwkJY2xhc3NGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQljbGFzc0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCXVwZGF0ZUVuYWJsZW1lbnQoKTsKKwkJCX0KKwkJfSk7CisKKwkJbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkFkZEN1c3RvbURpYWxvZy5saWJyYXJ5IikpOyAvLyROT04tTkxTLTEkOworCQlsaWJyYXJ5RmllbGQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdChkaWFsb2dBcmVhLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIOworCQlsaWJyYXJ5RmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJbGlicmFyeUZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXVwZGF0ZUVuYWJsZW1lbnQoKTsKKwkJCX0KKwkJfSk7CisKKwkJLy9wb3B1bGF0ZSBsaWJyYXJ5IGNvbWJvIGFuZCBzZWxlY3QgaW5wdXQgbGlicmFyeQorCQlpZiAobGlicmFyeVVybHMgPT0gbnVsbCkgeworCQkJbGlicmFyeVVybHMgPSBBcnJheXMuYXNMaXN0KEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKS5nZXRDdXN0b21VUkxzKCkpOworCQl9CisJCWludCBzZWxlY3Rpb24gPSAwOworCQlJdGVyYXRvciBpdHI9IGxpYnJhcnlVcmxzLml0ZXJhdG9yKCk7CisJCWludCBpPSAwOworCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgeworCQkJVVJMIGxpYiA9IChVUkwpIGl0ci5uZXh0KCk7CisJCQlsaWJyYXJ5RmllbGQuYWRkKGxpYi5nZXRGaWxlKCkpOworCQkJaWYgKGxpYi5lcXVhbHMobGlicmFyeSkpIHsKKwkJCQlzZWxlY3Rpb24gPSBpOworCQkJfQorCQkJaSsrOworCQl9CisJCQkKKwkJLy9pbnRpYWxpemUgZmllbGRzCisJCWlmICh0YXNrTmFtZSAhPSBudWxsKSB7CisJCQluYW1lRmllbGQuc2V0VGV4dCh0YXNrTmFtZSk7CisJCX0KKwkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CisJCQljbGFzc0ZpZWxkLnNldFRleHQoY2xhc3NOYW1lKTsKKwkJfQorCQlpZiAobGlicmFyeVVybHMuc2l6ZSgpID49IDApIHsKKwkJCWxpYnJhcnlGaWVsZC5zZWxlY3Qoc2VsZWN0aW9uKTsKKwkJfQorCisJCXJldHVybiBkaWFsb2dBcmVhOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQlyZXR1cm4gY2xhc3NOYW1lOworCX0KKwkKKwlwdWJsaWMgVVJMIGdldExpYnJhcnkoKSB7CisJCXJldHVybiBsaWJyYXJ5OworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFRhc2tOYW1lKCkgeworCQlyZXR1cm4gdGFza05hbWU7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCisJICovCisJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQljbGFzc05hbWUgPSBjbGFzc0ZpZWxkLmdldFRleHQoKTsKKwkJdGFza05hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpOworCQlpbnQgc2VsZWN0aW9uID0gbGlicmFyeUZpZWxkLmdldFNlbGVjdGlvbkluZGV4KCk7CisJCWlmIChzZWxlY3Rpb24gPj0gMCkgeworCQkJbGlicmFyeSA9IChVUkwpbGlicmFyeVVybHMuZ2V0KHNlbGVjdGlvbik7CisJCX0KKwkJc3VwZXIub2tQcmVzc2VkKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldExpYnJhcnkoVVJMIGxpYnJhcnkpIHsKKwkJdGhpcy5saWJyYXJ5ID0gbGlicmFyeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgdGFza05hbWUpIHsKKwkJdGhpcy50YXNrTmFtZSA9IHRhc2tOYW1lOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVFbmFibGVtZW50KCkgeworCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgeworCQkJb2tCdXR0b24uc2V0RW5hYmxlZCgKKwkJCQluYW1lRmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMAorCQkJCQkmJiBjbGFzc0ZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSA+IDAKKwkJCQkJJiYgbGlicmFyeUZpZWxkLmdldFNlbGVjdGlvbkluZGV4KCkgPj0gMCk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudEFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZGY1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50QWN0aW9uLmphdmEKQEAgLTAsMCArMSw3OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKKworLyoqCisgKiBBY3Rpb24gdG8gcnVuIGFuIGFudCBidWlsZCBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgQW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwlwcml2YXRlIElGaWxlIGZpbGU7CisJcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5pdGlhbGl6ZSBhY3Rpb24gdG8gcnVuIGFuCisJICogQW50IGJ1aWxkIGZpbGUKKwkgKiAKKwkgKiBAcGFyYW0gZmlsZSB0aGUgYW50IGJ1aWxkIGZpbGUgdG8gcnVuCisJICovCisJcHVibGljIEFudEFjdGlvbihJRmlsZSBmaWxlLCBJV29ya2JlbmNoV2luZG93IHdpbmRvdykgeworCQlzdXBlcigpOworCQl0aGlzLmZpbGUgPSBmaWxlOworCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKKwkJc2V0VGV4dChmaWxlLmdldE5hbWUoKSk7CisJCXNldFRvb2xUaXBUZXh0KGZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOworCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAodGhpcywgSUhlbHBDb250ZXh0SWRzLkFOVF9BQ1RJT04pOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmIChmaWxlID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJQW50VGFyZ2V0TGlzdCB0YXJnZXRMaXN0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXRhcmdldExpc3QgPSBBbnRVdGlsLmdldFRhcmdldExpc3QoZmlsZS5nZXRMb2NhdGlvbigpKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCisJCQkJd2luZG93LmdldFNoZWxsKCksCisJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQW50QWN0aW9uLnJ1bkVycm9yVGl0bGUiKSwgLy8kTk9OLU5MUy0xJAorCQkJCVRvb2xNZXNzYWdlcy5mb3JtYXQoIkFudEFjdGlvbi5lcnJvclJlYWRBbnRGaWxlIiwgbmV3IE9iamVjdFtdIHtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pLCAvLyROT04tTkxTLTEkOworCQkJCWUuZ2V0U3RhdHVzKCkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAodGFyZ2V0TGlzdCA9PSBudWxsKSB7CisJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcigKKwkJCQl3aW5kb3cuZ2V0U2hlbGwoKSwKKwkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRBY3Rpb24ucnVuRXJyb3JUaXRsZSIpLCAvLyROT04tTkxTLTEkOworCQkJCVRvb2xNZXNzYWdlcy5mb3JtYXQoIkFudEFjdGlvbi5ub0FudFRhcmdldHMiLCBuZXcgT2JqZWN0W10ge2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSkpOyAvLyROT04tTkxTLTEkOworCQkJcmV0dXJuOworCQl9CisKKwkJQW50TGF1bmNoV2l6YXJkIHdpemFyZCA9IG5ldyBBbnRMYXVuY2hXaXphcmQodGFyZ2V0TGlzdCwgZmlsZSwgd2luZG93KTsKKwkJd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOworCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKKwkJZGlhbG9nLmNyZWF0ZSgpOworCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksIElIZWxwQ29udGV4dElkcy5BTlRfTEFVTkNIX1dJWkFSRCk7CQkKKwkJZGlhbG9nLm9wZW4oKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudENsYXNzcGF0aFBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRDbGFzc3BhdGhQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjMTc5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRDbGFzc3BhdGhQYWdlLmphdmEKQEAgLTAsMCArMSwyODQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK1RoaXMgZmlsZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmUuRXh0ZXJuYWxUb29sc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmUuVG9vbE1lc3NhZ2VzOworCisvKioKKyAqIFN1Yi1wYWdlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGN1c3RvbSBjbGFzc3BhdGhzCisgKiB0byBiZSB1c2VkIHdoZW4gcnVubmluZyBBbnQgYnVpbGQgZmlsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRDbGFzc3BhdGhQYWdlIGV4dGVuZHMgQW50UGFnZSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9KQVJTX0JVVFRPTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX0ZPTERFUl9CVVRUT04gPSBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9CVVRUT04gPSBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDM7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQX0JVVFRPTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgNDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9XTl9CVVRUT04gPSBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDU7CisKKwlwcml2YXRlIEJ1dHRvbiB1cEJ1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiBkb3duQnV0dG9uOworCQorCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGZEaWFsb2dTZXR0aW5nczsKKwkKKwlwcml2YXRlIGZpbmFsIEFudENsYXNzcGF0aExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBbnRDbGFzc3BhdGhMYWJlbFByb3ZpZGVyKCk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBBbnRDbGFzc3BhdGhQYWdlKEFudFByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7CisJCXN1cGVyKHByZWZlcmVuY2VQYWdlKTsKKwkJZkRpYWxvZ1NldHRpbmdzPSBFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFudFBhZ2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQnV0dG9uc1RvQnV0dG9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgeworCQljcmVhdGVCdXR0b24ocGFyZW50LCAiQW50Q2xhc3NwYXRoUGFnZS5hZGRKYXJCdXR0b25UaXRsZSIsIEFERF9KQVJTX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQ7CisJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsICJBbnRDbGFzc3BhdGhQYWdlLmFkZEZvbGRlckJ1dHRvblRpdGxlIiwgQUREX0ZPTERFUl9CVVRUT04pOyAvLyROT04tTkxTLTEkOworCQljcmVhdGVTZXBhcmF0b3IocGFyZW50KTsKKwkJdXBCdXR0b249IGNyZWF0ZUJ1dHRvbihwYXJlbnQsICJBbnRDbGFzc3BhdGhQYWdlLnVwQnV0dG9uVGl0bGUiLCBVUF9CVVRUT04pOyAvLyROT04tTkxTLTEkOworCQlkb3duQnV0dG9uPSBjcmVhdGVCdXR0b24ocGFyZW50LCAiQW50Q2xhc3NwYXRoUGFnZS5kb3duQnV0dG9uVGl0bGUiLCBET1dOX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQ7CisJCXJlbW92ZUJ1dHRvbj0gY3JlYXRlQnV0dG9uKHBhcmVudCwgIkFudENsYXNzcGF0aFBhZ2UucmVtb3ZlQnV0dG9uVGl0bGUiLCBSRU1PVkVfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJDsKKwl9CisJCisJLyoqCisJICogQWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGEgZm9sZGVyIGFzIGEgY2xhc3NwYXRoLgorCSAqLworCXByaXZhdGUgdm9pZCBhZGRGb2xkZXJCdXR0b25QcmVzc2VkKCkgeworCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKKwkJZGlhbG9nLnNldE1lc3NhZ2UoQW50RGlhbG9nTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRDbGFzc3BhdGhQYWdlLiZDaG9vc2VfYV9mb2xkZXJfdG9fYWRkX3RvX3RoZV9jbGFzc3BhdGhfXzEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGU6IiArIHJlc3VsdCArICIvIik7IC8vJE5PTi1OTFMtMiQ7Ly8kTk9OLU5MUy0xJDsKKwkJCQlhZGRDb250ZW50KHVybCk7CisJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIEFsbG93cyB0aGUgdXNlciB0byBlbnRlciBhZGQgSkFScyB0byB0aGUgY2xhc3NwYXRoLgorCSAqLworCXByaXZhdGUgdm9pZCBhZGRKYXJzQnV0dG9uUHJlc3NlZCgpIHsKKwkJU3RyaW5nIGxhc3RVc2VkUGF0aDsKKwkJbGFzdFVzZWRQYXRoPSBmRGlhbG9nU2V0dGluZ3MuZ2V0KElVSUNvbnN0YW50cy5ESUFMT0dTVE9SRV9MQVNURVhUSkFSKTsKKwkJaWYgKGxhc3RVc2VkUGF0aCA9PSBudWxsKSB7CisJCQlsYXN0VXNlZFBhdGg9ICIiOyAvLyROT04tTkxTLTEkCisJCX0KKwkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuTVVMVEkpOworCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi5qYXIiIH0pOyAvLyROT04tTkxTLTEkOworCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0VXNlZFBhdGgpOworCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSVBhdGggZmlsdGVyUGF0aD0gbmV3IFBhdGgoZGlhbG9nLmdldEZpbHRlclBhdGgoKSk7CisJCVN0cmluZ1tdIHJlc3VsdHM9IGRpYWxvZy5nZXRGaWxlTmFtZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgamFyTmFtZSA9IHJlc3VsdHNbaV07CisJCQl0cnkgeworCQkJCUlQYXRoIHBhdGg9IGZpbHRlclBhdGguYXBwZW5kKGphck5hbWUpLm1ha2VBYnNvbHV0ZSgpOwkKKwkJCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZToiICsgcGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkOworCQkJCWFkZENvbnRlbnQodXJsKTsKKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJCisJCWZEaWFsb2dTZXR0aW5ncy5wdXQoSVVJQ29uc3RhbnRzLkRJQUxPR1NUT1JFX0xBU1RFWFRKQVIsIGZpbHRlclBhdGgudG9PU1N0cmluZygpKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBbnRQYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7CisJCXN3aXRjaCAoYnV0dG9uSWQpIHsKKwkJCWNhc2UgQUREX0pBUlNfQlVUVE9OIDoKKwkJCQlhZGRKYXJzQnV0dG9uUHJlc3NlZCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRERfRk9MREVSX0JVVFRPTiA6CisJCQkJYWRkRm9sZGVyQnV0dG9uUHJlc3NlZCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBVUF9CVVRUT04gOgorCQkJCWhhbmRsZU1vdmUoLTEpOworCQkJCWJyZWFrOworCQkJY2FzZSBET1dOX0JVVFRPTiA6CisJCQkJaGFuZGxlTW92ZSgxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVNT1ZFX0JVVFRPTiA6CisJCQkJcmVtb3ZlQnV0dG9uUHJlc3NlZCgpOworCQkJCWJyZWFrOworCQl9CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIHRhYiBpdGVtIHRoYXQgY29udGFpbnMgdGhpcyBzdWItcGFnZS4KKwkgKi8KKwlwdWJsaWMgVGFiSXRlbSBjcmVhdGVUYWJJdGVtKFRhYkZvbGRlciBmb2xkZXIpIHsKKwkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7CisJCWl0ZW0uc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRDbGFzc3BhdGhQYWdlLnRpdGxlIikpOyAvLyROT04tTkxTLTEkOworCQlpdGVtLnNldEltYWdlKGxhYmVsUHJvdmlkZXIuZ2V0Q2xhc3NwYXRoSW1hZ2UoKSk7CisJCWl0ZW0uc2V0RGF0YSh0aGlzKTsKKwkJaXRlbS5zZXRDb250cm9sKGNyZWF0ZUNvbnRyb2woZm9sZGVyKSk7CisJCXJldHVybiBpdGVtOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQW50UGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgSVRhYmxlTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBbnRQYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHRhYmxlU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKKwkKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWdldFRhYmxlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7CisJCUxpc3QgdXJscyA9IGdldENvbnRlbnRzKCk7CisJCWJvb2xlYW4gbm90RW1wdHkgPSAhc2VsZWN0aW9uLmlzRW1wdHkoKTsKKwkJSXRlcmF0b3IgZWxlbWVudHM9IHNlbGVjdGlvbi5pdGVyYXRvcigpOworCQlib29sZWFuIGZpcnN0PSBmYWxzZTsKKwkJYm9vbGVhbiBsYXN0PSBmYWxzZTsKKwkJaW50IGxhc3RVcmw9IHVybHMuc2l6ZSgpIC0gMTsKKwkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBlbGVtZW50cy5uZXh0KCk7CisJCQlpZighZmlyc3QgJiYgdXJscy5pbmRleE9mKGVsZW1lbnQpID09IDApIHsKKwkJCQlmaXJzdD0gdHJ1ZTsKKwkJCX0KKwkJCWlmICghbGFzdCAmJiB1cmxzLmluZGV4T2YoZWxlbWVudCkgPT0gbGFzdFVybCkgeworCQkJCWxhc3Q9IHRydWU7CisJCQl9CisJCX0KKwkJCisJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKG5vdEVtcHR5KTsKKwkJdXBCdXR0b24uc2V0RW5hYmxlZChub3RFbXB0eSAmJiAhZmlyc3QpOworCQlkb3duQnV0dG9uLnNldEVuYWJsZWQobm90RW1wdHkgJiYgIWxhc3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNb3ZlKGludCBkaXJlY3Rpb24pIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWdldFRhYmxlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7CisJCUxpc3Qgc2VsTGlzdD0gc2VsLnRvTGlzdCgpOworCQlMaXN0IGNvbnRlbnRzPSBnZXRDb250ZW50cygpOworCQlPYmplY3RbXSBtb3ZlZFVSTD0gbmV3IE9iamVjdFtjb250ZW50cy5zaXplKCldOworCQlpbnQgaTsKKwkJZm9yIChJdGVyYXRvciB1cmxzID0gc2VsTGlzdC5pdGVyYXRvcigpOyB1cmxzLmhhc05leHQoKTspIHsKKwkJCU9iamVjdCBjb25maWcgPSB1cmxzLm5leHQoKTsKKwkJCWk9IGNvbnRlbnRzLmluZGV4T2YoY29uZmlnKTsKKwkJCW1vdmVkVVJMW2kgKyBkaXJlY3Rpb25dPSBjb25maWc7CisJCX0KKwkJCisJCWNvbnRlbnRzLnJlbW92ZUFsbChzZWxMaXN0KTsKKwkJCQorCQlmb3IgKGludCBqID0gMDsgaiA8IG1vdmVkVVJMLmxlbmd0aDsgaisrKSB7CisJCQlPYmplY3QgY29uZmlnID0gbW92ZWRVUkxbal07CisJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKKwkJCQljb250ZW50cy5hZGQoaiwgY29uZmlnKTsJCQorCQkJfQorCQl9CisJCXNldElucHV0KGNvbnRlbnRzKTsKKwkJZ2V0VGFibGVWaWV3ZXIoKS5yZWZyZXNoKCk7CQorCX0KKworCisJLyoqCisJICogTGFiZWwgcHJvdmlkZXIgZm9yIGNsYXNzcGF0aCBlbGVtZW50cworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEFudENsYXNzcGF0aExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfSkFSX0ZJTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9qYXJfbF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJDsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTEFTU1BBVEggPSAiaWNvbnMvZnVsbC9vYmoxNi9jbGFzc3BhdGguZ2lmIjsgLy8kTk9OLU5MUy0xJDsKKworCQlwcml2YXRlIEltYWdlIGNsYXNzcGF0aEltYWdlOworCQlwcml2YXRlIEltYWdlIGZvbGRlckltYWdlOworCQlwcml2YXRlIEltYWdlIGphckltYWdlOworCQorCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICovCisJCXB1YmxpYyBBbnRDbGFzc3BhdGhMYWJlbFByb3ZpZGVyKCkgeworCQl9CisJCQorCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQmFzZUxhYmVsUHJvdmlkZXIuCisJCSAqLworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJLy8gRm9sZGVyIGltYWdlIGlzIHNoYXJlZCwgZG8gbm90IGRpc3Bvc2UuCisJCQlmb2xkZXJJbWFnZSA9IG51bGw7CisJCQlpZiAoamFySW1hZ2UgIT0gbnVsbCkgeworCQkJCWphckltYWdlLmRpc3Bvc2UoKTsKKwkJCQlqYXJJbWFnZSA9IG51bGw7CisJCQl9CisJCQlpZiAoY2xhc3NwYXRoSW1hZ2UgIT0gbnVsbCkgeworCQkJCWNsYXNzcGF0aEltYWdlLmRpc3Bvc2UoKTsKKwkJCQljbGFzc3BhdGhJbWFnZSA9IG51bGw7CisJCQl9CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogTWV0aG9kIGRlY2xhcmVkIG9uIElUYWJsZUxhYmVsUHJvdmlkZXIuCisJCSAqLworCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJVVJMIHVybCA9IChVUkwpIGVsZW1lbnQ7CisJCQlpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIGdldEZvbGRlckltYWdlKCk7CisJCQllbHNlCisJCQkJcmV0dXJuIGdldEphckltYWdlKCk7CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogTWV0aG9kIGRlY2xhcmVkIG9uIElUYWJsZUxhYmVsUHJvdmlkZXIuCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJcmV0dXJuICgoVVJMKSBlbGVtZW50KS5nZXRGaWxlKCk7CisJCX0KKworCQlwcml2YXRlIEltYWdlIGdldEZvbGRlckltYWdlKCkgeworCQkJaWYgKGZvbGRlckltYWdlID09IG51bGwpCisJCQkJZm9sZGVySW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOworCQkJcmV0dXJuIGZvbGRlckltYWdlOworCQl9CisJCQorCQlwcml2YXRlIEltYWdlIGdldEphckltYWdlKCkgeworCQkJaWYgKGphckltYWdlID09IG51bGwpIHsKKwkJCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfSkFSX0ZJTEUpOworCQkJCWphckltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOworCQkJfQorCQkJcmV0dXJuIGphckltYWdlOworCQl9CisJCQorCQlwcml2YXRlIEltYWdlIGdldENsYXNzcGF0aEltYWdlKCkgeworCQkJaWYgKGNsYXNzcGF0aEltYWdlID09IG51bGwpIHsKKwkJCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfQ0xBU1NQQVRIKTsKKwkJCQljbGFzc3BhdGhJbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKKwkJCX0KKwkJCXJldHVybiBjbGFzc3BhdGhJbWFnZTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50RGlhbG9nTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnREaWFsb2dNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDZlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50RGlhbG9nTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitUaGlzIGZpbGUgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBBbnREaWFsb2dNZXNzYWdlcyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aS5BbnREaWFsb2dNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIEFudERpYWxvZ01lc3NhZ2VzKCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOworCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuICchJyArIGtleSArICchJzsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnREaWFsb2dNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudERpYWxvZ01lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzMTJkYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnREaWFsb2dNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK0FudENsYXNzcGF0aFBhZ2UuJkNob29zZV9hX2ZvbGRlcl90b19hZGRfdG9fdGhlX2NsYXNzcGF0aF9fMT0mQ2hvb3NlIGEgZm9sZGVyIHRvIGFkZCB0byB0aGUgY2xhc3NwYXRoOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudExhdW5jaFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudExhdW5jaFdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjFmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50TGF1bmNoV2l6YXJkLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS4qOworCisvKioKKyAqIFRoZSB3aXphcmQgdG8gcnVuIGFuIEFudCBmaWxlIHdoZW4gdGhlIFJ1biBBbnQuLi4KKyAqIGNvbnRleHQgbWVudSBhY3Rpb24gaXMgY2hvb3NlbiBieSB0aGUgdXNlci4KKyAqIDxwPgorICogTm90ZTogQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgb25lIHBhZ2UgaW4gdGhpcyB3aXphcmQuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBBbnRMYXVuY2hXaXphcmQgZXh0ZW5kcyBXaXphcmQgeworCS8qKgorCSAqIFRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIEFudCBmaWxlLgorCSAqLworCXByaXZhdGUgSUZpbGUgYW50RmlsZSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgQW50IHByb2plY3QgZGVzY3JpYmVkIGluIHRoZSB4bWwgZmlsZS4KKwkgKi8KKwlwcml2YXRlIEFudFRhcmdldExpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgZXh0ZXJuYWwgdG9vbCByZXByZXNlbnRpbmcgdGhlIEFudCBmaWxlCisJICovCisJcHJpdmF0ZSBFeHRlcm5hbFRvb2wgYW50VG9vbCA9IG51bGw7CisKKwkvKioKKwkgKiBXaGV0aGVyIHRoZSBleHRlcm5hbCB0b29sIGlzIG5ldyBmb3IgdGhpcyB3aXphcmQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNOZXdUb29sID0gZmFsc2U7CisJCisJLyoqCisJICogVGhlIHdvcmtiZW5jaCB3aW5kb3cgdGhhdCB0aGUgYWN0aW9uIGxhdW5jaAorCSAqIHRoaXMgd2l6YXJkLgorCSAqLworCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBudWxsOworCisJLyoqCisJICogVGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZC4KKwkgKi8KKwlwcml2YXRlIEFudExhdW5jaFdpemFyZFBhZ2UgcGFnZTEgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB3aXphcmQsIGdpdmVuIHRoZSBwcm9qZWN0IGRlc2NyaWJlZCBpbiB0aGUKKwkgKiBmaWxlIGFuZCB0aGUgZmlsZSBpdHNlbGYuCisJICogCisJICogQHBhcmFtIGFudFByb2plY3QKKwkgKiBAcGFyYW0gYW50RmlsZQorCSAqLworCXB1YmxpYyBBbnRMYXVuY2hXaXphcmQoQW50VGFyZ2V0TGlzdCB0YXJnZXRMaXN0LCBJRmlsZSBhbnRGaWxlLCBJV29ya2JlbmNoV2luZG93IHdpbmRvdykgeworCQlzdXBlcigpOworCQl0aGlzLnRhcmdldExpc3QgPSB0YXJnZXRMaXN0OworCQl0aGlzLmFudEZpbGUgPSBhbnRGaWxlOworCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKKwkJU3RyaW5nIGFudFBhdGggPSBhbnRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKKwkJdGhpcy5hbnRUb29sID0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVnaXN0cnkoKS5nZXRFeHRlcm5hbFRvb2woYW50UGF0aCk7CisJCWlmICh0aGlzLmFudFRvb2wgPT0gbnVsbCkgeworCQkJdGhpcy5hbnRUb29sID0gbmV3IEV4dGVybmFsVG9vbCgpOworCQkJdGhpcy5hbnRUb29sLnNldE5hbWUoYW50UGF0aCk7CisJCQl0aGlzLmFudFRvb2wuc2V0VHlwZShFeHRlcm5hbFRvb2wuVE9PTF9UWVBFX0FOVCk7CisJCQl0aGlzLmFudFRvb2wuc2V0TG9jYXRpb24oVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX1dPUktTUEFDRV9MT0MsIGFudFBhdGgpKTsKKwkJCXRoaXMuaXNOZXdUb29sID0gdHJ1ZTsKKwkJfQorCQlzZXRXaW5kb3dUaXRsZShUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRMYXVuY2hXaXphcmQuc2hlbGxUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJDsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQlwYWdlMSA9IG5ldyBBbnRMYXVuY2hXaXphcmRQYWdlKHRhcmdldExpc3QpOworCQlhZGRQYWdlKHBhZ2UxKTsKKwkJCisJCVN0cmluZyBhcmdzID0gYW50VG9vbC5nZXRBcmd1bWVudHMoKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJU3RyaW5nW10gdGFyZ2V0cyA9IFRvb2xVdGlsLmV4dHJhY3RWYXJpYWJsZUFyZ3VtZW50cyhhcmdzLCBFeHRlcm5hbFRvb2wuVkFSX0FOVF9UQVJHRVQsIGJ1Zik7CisJCQorCQlwYWdlMS5zZXRJbml0aWFsVGFyZ2V0cyh0YXJnZXRzKTsKKwkJcGFnZTEuc2V0SW5pdGlhbEFyZ3VtZW50cyhidWYudG9TdHJpbmcoKSk7CisJCXBhZ2UxLnNldEluaXRpYWxEaXNwbGF5TG9nKGFudFRvb2wuZ2V0U2hvd0xvZygpKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCXVwZGF0ZVRvb2woKTsKKwkJVG9vbFV0aWwuc2F2ZURpcnR5RWRpdG9ycyh3aW5kb3cpOworCQlpZiAoYW50VG9vbC5nZXRTaG93TG9nKCkpIHsKKwkJCVRvb2xVdGlsLnNob3dMb2dDb25zb2xlKHdpbmRvdyk7CisJCQlUb29sVXRpbC5jbGVhckxvZ0RvY3VtZW50KCk7CisJCX0KKwkJCisJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQkJCURlZmF1bHRSdW5uZXJDb250ZXh0IGNvbnRleHQgPSBuZXcgRGVmYXVsdFJ1bm5lckNvbnRleHQoYW50VG9vbCwgYW50RmlsZS5nZXRQcm9qZWN0KCksIHdpbmRvdy5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpKTsKKwkJCQljb250ZXh0LnJ1bihtb25pdG9yLCB3aW5kb3cuZ2V0U2hlbGwoKSk7CisJCQl9OworCQl9OworCisJCXRyeSB7CisJCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOworCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQorCQkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbillLmdldFRhcmdldEV4Y2VwdGlvbigpKS5nZXRTdGF0dXMoKTsKKwkJCWVsc2UKKwkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEV4dGVybmFsVG9vbHNQbHVnaW4uUExVR0lOX0lELCAwLCBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRMYXVuY2hXaXphcmQuaW50ZXJuYWxBbnRFcnJvciIpLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJDsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKKwkJCQlnZXRTaGVsbCgpLCAKKwkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRMYXVuY2hXaXphcmQucnVuRXJyb3JUaXRsZSIpLCAvLyROT04tTkxTLTEkOworCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkFudExhdW5jaFdpemFyZC5ydW5BbnRQcm9ibGVtIiksIC8vJE5PTi1OTFMtMSQ7CisJCQkJc3RhdHVzKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIE1ldGhvZCB1cGRhdGVUb29sLgorCSAqLworCXByaXZhdGUgdm9pZCB1cGRhdGVUb29sKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihwYWdlMS5nZXRBcmd1bWVudHMoKSk7CisJCVN0cmluZ1tdIHRhcmdldHMgPSBwYWdlMS5nZXRTZWxlY3RlZFRhcmdldHMoKTsKKwkJVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZ3MoRXh0ZXJuYWxUb29sLlZBUl9BTlRfVEFSR0VULCB0YXJnZXRzLCBidWYpOworCQkKKwkJYW50VG9vbC5zZXRBcmd1bWVudHMoYnVmLnRvU3RyaW5nKCkpOworCQlhbnRUb29sLnNldFNob3dMb2cocGFnZTEuZ2V0U2hvd0xvZygpKTsKKworCQlBcnJheUxpc3QgdG9vbHMgPSBFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZWdpc3RyeSgpLmdldEV4dGVybmFsVG9vbHMoKTsKKwkJaWYgKGlzTmV3VG9vbCkgeworCQkJdG9vbHMuYWRkKGFudFRvb2wpOworCQkJaXNOZXdUb29sID0gZmFsc2U7CisJCX0KKwkJRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVnaXN0cnkoKS5zZXRFeHRlcm5hbFRvb2xzKHRvb2xzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudExhdW5jaFdpemFyZFBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRMYXVuY2hXaXphcmRQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwMWYwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRMYXVuY2hXaXphcmRQYWdlLmphdmEKQEAgLTAsMCArMSwyMjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKKworLyoqCisgKiBGaXJzdCBwYWdlIG9mIHRoZSBydW4gQW50IHdpemFyZC4gQWxsb3dzIHRoZSB1c2VyIHRvIHBpY2sKKyAqIHRoZSB0YXJnZXRzLCBzdXBwbHkgZXh0cmEgYXJndW1lbnRzLCBhbmQgZGVjaWRlIHRvIHNob3cKKyAqIG91dHB1dCB0byB0aGUgY29uc29sZS4KKyAqLworcHVibGljIGNsYXNzIEFudExhdW5jaFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfSEVJR0hUID0gMjAwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9XSURUSCA9IDIwMDsKKworCXByaXZhdGUgQW50VGFyZ2V0TGlzdCB0YXJnZXRMaXN0OworCXByaXZhdGUgU3RyaW5nIGluaXRpYWxUYXJnZXRzW107CisJcHJpdmF0ZSBTdHJpbmcgaW5pdGlhbEFyZ3VtZW50czsKKwlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbERpc3BsYXlMb2cgPSB0cnVlOworCXByaXZhdGUgQXJyYXlMaXN0IHNlbGVjdGVkVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgbGlzdFZpZXdlcjsKKwlwcml2YXRlIEFudFRhcmdldExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBbnRUYXJnZXRMYWJlbFByb3ZpZGVyKCk7CisJcHJpdmF0ZSBCdXR0b24gc2hvd0xvZzsKKwlwcml2YXRlIFRleHQgYXJndW1lbnRzRmllbGQ7CisKKwlwdWJsaWMgQW50TGF1bmNoV2l6YXJkUGFnZShBbnRUYXJnZXRMaXN0IHRhcmdldExpc3QpIHsKKwkJc3VwZXIoIkFudFNjcmlwdFBhZ2UiKTsgLy8kTk9OLU5MUy0xJDsKKwkJdGhpcy50YXJnZXRMaXN0ID0gdGFyZ2V0TGlzdDsKKwkJc2V0VGl0bGUoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQW50TGF1bmNoV2l6YXJkLmRpYWxvZ1RpdGxlIikpOyAvLyROT04tTkxTLTEkOworCQlzZXREZXNjcmlwdGlvbihUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRMYXVuY2hXaXphcmQuZGlhbG9nRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQ7CisJCXNldEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2Z1bGwvd2l6YmFuL2FudF93aXouZ2lmIikpOyAvLyROT04tTkxTLTEkOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgYmFubmVyCisJICovCisJcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKwkJdHJ5IHsKKwkJCVVSTCBpbnN0YWxsVVJMID0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKKwkJCVVSTCB1cmwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIHJlbGF0aXZlUGF0aCk7CisJCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOworCisJCS8vIFRoZSBsaXN0IG9mIHRhcmdldHMKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQW50TGF1bmNoV2l6YXJkUGFnZS50YXJnZXRMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJDsKKworCQlsaXN0Vmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlkYXRhLmhlaWdodEhpbnQgPSBTSVpJTkdfU0VMRUNUSU9OX1dJREdFVF9IRUlHSFQ7CisJCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEg7CisJCWxpc3RWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQlsaXN0Vmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgeworCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisJCQkJcmV0dXJuICgoU3RyaW5nKW8xKS5jb21wYXJlVG8oKFN0cmluZykgbzIpOworCQkJfQorCQl9KTsKKwkJaWYgKHRhcmdldExpc3QuZ2V0RGVmYXVsdFRhcmdldCgpICE9IG51bGwpCisJCQlsYWJlbFByb3ZpZGVyLnNldERlZmF1bHRUYXJnZXROYW1lKHRhcmdldExpc3QuZ2V0RGVmYXVsdFRhcmdldCgpKTsKKwkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOworCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQW50VGFyZ2V0Q29udGVudFByb3ZpZGVyKCkpOworCQlsaXN0Vmlld2VyLnNldElucHV0KHRhcmdldExpc3QpOworCisJCS8vIFRoZSBhcmd1bWVudHMgZmllbGQKKwkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQW50TGF1bmNoV2l6YXJkUGFnZS5hcmdzTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQ7CisJCQorCQlhcmd1bWVudHNGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7CisJCWFyZ3VtZW50c0ZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQlhcmd1bWVudHNGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQl2YWxpZGF0ZVBhZ2VDb21wbGV0ZSgpOworCQkJfQorCQl9KTsKKworCQkvLyBUaGUgc2hvdyBsb2cgb3B0aW9uCisJCXNob3dMb2cgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKwkJc2hvd0xvZy5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkFudExhdW5jaFdpemFyZFBhZ2Uuc2hvd0xvZ0xhYmVsIikpOyAvLyROT04tTkxTLTEkOworCQkKKwkJLy8gU2V0dXAgaW5pdGlhbCBmaWVsZCB2YWx1ZXMKKwkJaWYgKGluaXRpYWxBcmd1bWVudHMgIT0gbnVsbCkKKwkJCWFyZ3VtZW50c0ZpZWxkLnNldFRleHQoaW5pdGlhbEFyZ3VtZW50cyk7CisJCXNob3dMb2cuc2V0U2VsZWN0aW9uKGluaXRpYWxEaXNwbGF5TG9nKTsKKwkJc2VsZWN0SW5pdGlhbFRhcmdldHMoKTsKKwkJCisJCXZhbGlkYXRlUGFnZUNvbXBsZXRlKCk7CisKKwkJbGlzdFZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IFRhcmdldENoZWNrTGlzdGVuZXIoKSk7CisJCWxpc3RWaWV3ZXIucmVmcmVzaCgpOworCQlhcmd1bWVudHNGaWVsZC5zZXRGb2N1cygpOworCQkKKwkJc2V0Q29udHJvbChjb21wb3NpdGUpOworCisJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5BTlRfTEFVTkNIX1dJWkFSRF9QQUdFKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgYXJndW1lbnRzIHRoYXQgdGhlIHVzZXIgaGFzIGVudGVyZWQKKwkgKiB0byBydW4gdGhlIGFudCBmaWxlLgorCSAqIAorCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBhcmd1bWVudHMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFyZ3VtZW50cygpIHsKKwkJcmV0dXJuIGFyZ3VtZW50c0ZpZWxkLmdldFRleHQoKS50cmltKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHRhcmdldHMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0U2VsZWN0ZWRUYXJnZXRzKCkgeworCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbc2VsZWN0ZWRUYXJnZXRzLnNpemUoKV07CisJCXNlbGVjdGVkVGFyZ2V0cy50b0FycmF5KG5hbWVzKTsKKwkJcmV0dXJuIG5hbWVzOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXJzIHdhbnRzIG1lc3NhZ2VzIGZyb20gcnVubmluZworCSAqIHRoZSB0b29sIGRpc3BsYXllZCBpbiB0aGUgY29uc29sZQorCSAqLworCXB1YmxpYyBib29sZWFuIGdldFNob3dMb2coKSB7CisJCXJldHVybiBzaG93TG9nLmdldFNlbGVjdGlvbigpOworCX0KKworCS8qKgorCSAqIFNldHVwIHRoZSBpbml0aWFsIHNlbGVjdGVkIHRhcmdldHMgaW4gdGhlIHZpZXdlcgorCSAqLwkKKwlwcml2YXRlIHZvaWQgc2VsZWN0SW5pdGlhbFRhcmdldHMoKSB7CisJCWlmIChpbml0aWFsVGFyZ2V0cyAhPSBudWxsICYmIGluaXRpYWxUYXJnZXRzLmxlbmd0aCA+IDApIHsKKwkJCVN0cmluZ1tdIHRhcmdldHMgPSB0YXJnZXRMaXN0LmdldFRhcmdldHMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbFRhcmdldHMubGVuZ3RoOyBpKyspIHsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRhcmdldHMubGVuZ3RoOyBqKyspIHsKKwkJCQkJaWYgKHRhcmdldHNbal0uZXF1YWxzKGluaXRpYWxUYXJnZXRzW2ldKSkgeworCQkJCQkJU3RyaW5nIHRhcmdldCA9IHRhcmdldHNbal07CisJCQkJCQlsaXN0Vmlld2VyLnNldENoZWNrZWQodGFyZ2V0LCB0cnVlKTsKKwkJCQkJCXNlbGVjdGVkVGFyZ2V0cy5hZGQodGFyZ2V0KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJU3RyaW5nIHRhcmdldCA9IHRhcmdldExpc3QuZ2V0RGVmYXVsdFRhcmdldCgpOworCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7CisJCQkJbGlzdFZpZXdlci5zZXRDaGVja2VkKHRhcmdldCwgdHJ1ZSk7CisJCQkJc2VsZWN0ZWRUYXJnZXRzLmFkZCh0YXJnZXQpOworCQkJfQorCQl9CisJCQorCQlsYWJlbFByb3ZpZGVyLnNldFNlbGVjdGVkVGFyZ2V0cyhzZWxlY3RlZFRhcmdldHMpOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIHRoZSB0YXJnZXQgbGlzdCBmaWVsZC4KKwkgKiBJZ25vcmVkIGlmIGNvbnRyb2xzIGFscmVhZHkgY3JlYXRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVGFyZ2V0cyhTdHJpbmcgdmFsdWVbXSkgeworCQlpbml0aWFsVGFyZ2V0cyA9IHZhbHVlOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIHRoZSBhcmd1bWVudHMgdGV4dCBmaWVsZC4KKwkgKiBJZ25vcmVkIGlmIGNvbnRyb2xzIGFscmVhZHkgY3JlYXRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQXJndW1lbnRzKFN0cmluZyB2YWx1ZSkgeworCQlpbml0aWFsQXJndW1lbnRzID0gdmFsdWU7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIGRpc3BsYXkgdG8gbG9nIG9wdGlvbiBmaWVsZC4KKwkgKiBJZ25vcmVkIGlmIGNvbnRyb2xzIGFscmVhZHkgY3JlYXRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsRGlzcGxheUxvZyhib29sZWFuIHZhbHVlKSB7CisJCWluaXRpYWxEaXNwbGF5TG9nID0gdmFsdWU7CisJfQorCQorCS8qKgorCSAqIFZhbGlkYXRlcyB0aGUgcGFnZSBpcyBjb21wbGV0ZQorCSAqLworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhZ2VDb21wbGV0ZSgpIHsKKwkJc2V0UGFnZUNvbXBsZXRlKHNlbGVjdGVkVGFyZ2V0cy5zaXplKCkgPiAwIHx8IGdldEFyZ3VtZW50cygpLmxlbmd0aCgpID4gMCk7CisJfQorCQorCQorCS8qKgorCSAqIElubmVyIGNsYXNzIGZvciBjaGVja2JveCBsaXN0ZW5lcgorCSAqLworCXByaXZhdGUgY2xhc3MgVGFyZ2V0Q2hlY2tMaXN0ZW5lciBpbXBsZW1lbnRzIElDaGVja1N0YXRlTGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKKwkJCVN0cmluZyBjaGVja2VkVGFyZ2V0ID0gKFN0cmluZykgZS5nZXRFbGVtZW50KCk7CisJCQlpZiAoZS5nZXRDaGVja2VkKCkpCisJCQkJc2VsZWN0ZWRUYXJnZXRzLmFkZChjaGVja2VkVGFyZ2V0KTsKKwkJCWVsc2UKKwkJCQlzZWxlY3RlZFRhcmdldHMucmVtb3ZlKGNoZWNrZWRUYXJnZXQpOworCQorCQkJbGFiZWxQcm92aWRlci5zZXRTZWxlY3RlZFRhcmdldHMoc2VsZWN0ZWRUYXJnZXRzKTsKKwkJCWxpc3RWaWV3ZXIucmVmcmVzaCgpOworCQkJdmFsaWRhdGVQYWdlQ29tcGxldGUoKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50UGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNiNWMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudFBhZ2UuamF2YQpAQCAtMCwwICsxLDI3OCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorVGhpcyBmaWxlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLlRvb2xNZXNzYWdlczsKKworLyoqCisgKiBQcm92aWRlcyB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzdWItcGFnZSBpbiB0aGUKKyAqIEFudCBwcmVmZXJlbmNlIHBhZ2UuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbnRQYWdlIHsKKwlwcml2YXRlIFNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQlidXR0b25QcmVzc2VkKCgoSW50ZWdlcikgZS53aWRnZXQuZ2V0RGF0YSgpKS5pbnRWYWx1ZSgpKTsKKwkJfQorCX07CisJcHJpdmF0ZSBBbnRQcmVmZXJlbmNlUGFnZSBwcmVmZXJlbmNlUGFnZTsKKwlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOworCXByaXZhdGUgQW50UGFnZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7CisJCisJcHJvdGVjdGVkIEJ1dHRvbiBlZGl0QnV0dG9uOworCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlQnV0dG9uOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIHBhZ2UuCisJICovCisJcHVibGljIEFudFBhZ2UoQW50UHJlZmVyZW5jZVBhZ2UgcHJlZmVyZW5jZVBhZ2UpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5wcmVmZXJlbmNlUGFnZSA9IHByZWZlcmVuY2VQYWdlOworCX0KKwkKKwkvKioKKwkgKiBBZGRzIGJ1dHRvbnMgc3BlY2lmaWMgdG8gdGhlIHBhZ2UuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkQnV0dG9uc1RvQnV0dG9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCk7CisJCisJLyoqCisJICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIGNvbnRlbnRzCisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQ29udGVudChPYmplY3QgbykgeworCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpCisJCQljb250ZW50UHJvdmlkZXIuYWRkKG8pOworCX0KKwkKKwkvKioKKwkgKiBIYW5kbGVzIGEgYnV0dG9uIHByZXNzZWQgZXZlbnQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgYnV0dG9uIHdpdGggYXBwcm9wcmlhdGUgc2l6ZSBhbmQgbGF5b3V0LgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRyb2wgdG8gY3JlYXRlIHRoZSBidXR0b24gb24KKwkgKiBAcGFyYW0gbGFiZWxLZXkgdGhlIGtleSB0byBsb29rdXAgdGhlIGJ1dHRvbidzIGxhYmVsCisJICogQHBhcmFtIGJ1dHRvbklkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhpcyBidXR0b24KKwkgKiBAcmV0dXJuIGEgbmV3IGFuZCBpbml0aWFsaXplZCBidXR0b24KKwkgKi8KKwlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxLZXksIGludCBidXR0b25JZCkgeworCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKKwkJYnV0dG9uLnNldFRleHQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZyhsYWJlbEtleSkpOworCQlidXR0b24uc2V0RGF0YShuZXcgSW50ZWdlcihidXR0b25JZCkpOworCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uQWRhcHRlcik7CisJCXByZWZlcmVuY2VQYWdlLnNldEJ1dHRvbkdyaWREYXRhKGJ1dHRvbik7CisJCXJldHVybiBidXR0b247CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIGdyb3VwIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgYnV0dG9ucy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uR3JvdXAoQ29tcG9zaXRlIHRvcCkgeworCQlDb21wb3NpdGUgYnV0dG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOworCisJCWFkZEJ1dHRvbnNUb0J1dHRvbkdyb3VwKGJ1dHRvbkdyb3VwKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgc3BhY2UgYmV0d2VlbiBjb250cm9scworCSAqLworCXByb3RlY3RlZCBmaW5hbCBMYWJlbCBjcmVhdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCkgeworCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisJCWdkLmhlaWdodEhpbnQgPSA0OworCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7CisJCXJldHVybiBzZXBhcmF0b3I7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIHRhYmxlIHZpZXdlci4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOworCQlHcmlkRGF0YSBkYXRhPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIOworCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQW50UGFnZUNvbnRlbnRQcm92aWRlcigpOworCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7CisJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOworCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7CisJCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJdGFibGVTZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgbGlzdGVkIG9iamVjdHMgaW4gdGhlIHRhYmxlLiAgUmV0dXJucyBudWxsCisJICogaWYgdGhpcyB3aWRnZXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkIG9yIGhhcyBiZWVuIGRpc3Bvc2VkLgorCSAqLworCXB1YmxpYyBMaXN0IGdldENvbnRlbnRzKCkgeworCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCB8fCB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQorCQkJcmV0dXJuIG51bGw7CisJCU9iamVjdFtdIGVsZW1lbnRzID0gY29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHRhYmxlVmlld2VyLmdldElucHV0KCkpOworCQlMaXN0IGNvbnRlbnRzPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWNvbnRlbnRzLmFkZChlbGVtZW50c1tpXSk7CisJCX0KKwkJcmV0dXJuIGNvbnRlbnRzOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsYWJlbCBwcm92aWRlciB0aGUgc3ViLXBhZ2Ugd2FudHMgdG8gdXNlCisJICogdG8gZGlzcGxheSBpdHMgY29udGVudCB3aXRoLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBJVGFibGVMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSB2aWV3ZXIsIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGdldFNlbGVjdGVkRWxlbWVudCgpIHsKKwkJaWYgKHRhYmxlVmlld2VyID09IG51bGwgfHwgdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGVsbCBvZiB0aGUgc3ViLXBhZ2UuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIFNoZWxsIGdldFNoZWxsKCkgeworCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCB8fCB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKKwl9CisJCisJLyoqCisJICogSGFuZGxlcyB0aGUgcmVtb3ZlIGJ1dHRvbiBwcmVzc2VkIGV2ZW50CisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQnV0dG9uUHJlc3NlZCgpIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJSXRlcmF0b3IgZW51bSA9IHNlbC5pdGVyYXRvcigpOworCQl3aGlsZSAoZW51bS5oYXNOZXh0KCkpCisJCQljb250ZW50UHJvdmlkZXIucmVtb3ZlKGVudW0ubmV4dCgpKTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHRhYmxlIG9uIHRoaXMgcGFnZS4gIEhhcyBubyBlZmZlY3QKKwkgKiBpZiB0aGlzIHdpZGdldCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQgb3IgaGFzIGJlZW4gZGlzcG9zZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0SW5wdXQoTGlzdCBpbnB1dHMpIHsKKwkJaWYgKHRhYmxlVmlld2VyID09IG51bGwgfHwgdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKKwkJCXJldHVybjsKKwkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoaW5wdXRzKTsKKwkJdGFibGVTZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCX0KKwkvKioKKwkgKiBIYW5kbGVzIHNlbGVjdGlvbiBjaGFuZ2VzIGluIHRoZSB0YWJsZSB2aWV3ZXIuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdGFibGVTZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgeworCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiB0aGUgdGFibGUgdmlld2VyLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIHVwZGF0ZUNvbnRlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKHRhYmxlVmlld2VyID09IG51bGwgfHwgdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKKwkJCXJldHVybjsKKwkJdGFibGVWaWV3ZXIudXBkYXRlKGVsZW1lbnQsIG51bGwpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIHRoaXMgcGFnZSdzIGNvbnRyb2xzCisJICovCisJcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDI7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7CisJCXRvcC5zZXRMYXlvdXQobGF5b3V0KTsKKworCQljcmVhdGVUYWJsZSh0b3ApOworCQljcmVhdGVCdXR0b25Hcm91cCh0b3ApOworCQkKKwkJcmV0dXJuIHRvcDsKKwl9CisKKworCS8qKgorCSAqIENvbnRlbnQgcHJvdmlkZXIgdGhhdCBtYWludGFpbnMgYSBnZW5lcmljIGxpc3Qgb2Ygb2JqZWN0cyB3aGljaAorCSAqIGFyZSBzaG93biBpbiBhIHRhYmxlIHZpZXdlci4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBbnRQYWdlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgeworCQlwcml2YXRlIEFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7CisJCisJCXB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgeworCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKG8pKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZWxlbWVudHMuYWRkKG8pOworCQkJdmlld2VyLmFkZChvKTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJfQorCQkKKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCXJldHVybiAoT2JqZWN0W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IE9iamVjdFtlbGVtZW50cy5zaXplKCldKTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCQl0aGlzLnZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOworCQkJZWxlbWVudHMuY2xlYXIoKTsKKwkJCWlmIChuZXdJbnB1dCAhPSBudWxsKQorCQkJCWVsZW1lbnRzLmFkZEFsbCgoTGlzdCkgbmV3SW5wdXQpOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IG8pIHsKKwkJCWVsZW1lbnRzLnJlbW92ZShvKTsKKwkJCXZpZXdlci5yZW1vdmUobyk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEFudFByZWZlcmVuY2VQYWdlIGdldFByZWZlcmVuY2VQYWdlKCkgeworCQlyZXR1cm4gcHJlZmVyZW5jZVBhZ2U7CisJfQorCQorCXByb3RlY3RlZCBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKKwkJcmV0dXJuIHRhYmxlVmlld2VyOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50UGFnZUxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRQYWdlTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGU2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50UGFnZUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS5FeHRlcm5hbFRvb2xzUGx1Z2luOworCisvKioKKyAqIExhYmVsIHByb3ZpZGVyIGZvciB0aGUgaXRlbXMgaW4gdGhlIGN1c3Rtb21pemUgYW50IHByZWZlcmVuY2UgcGFnZTogCisgKiBVUkxzLCBUYXNrcywgYW5kIFR5cGVzLgorICovCitwdWJsaWMgY2xhc3MgQW50UGFnZUxhYmVsUHJvdmlkZXIKKwlleHRlbmRzIExhYmVsUHJvdmlkZXIKKwlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCQkKKwlwcml2YXRlIEltYWdlIGZvbGRlckltYWdlOworCXByaXZhdGUgSW1hZ2UgamFySW1hZ2U7CisJcHJpdmF0ZSBJbWFnZSB0YXNrSW1hZ2U7CisJcHJpdmF0ZSBJbWFnZSB0eXBlSW1hZ2U7CisKKwlwdWJsaWMgQW50UGFnZUxhYmVsUHJvdmlkZXIoKSB7CisJfQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vbm90ZTogZm9sZGVyIGFuZCB0YXNrIGFyZSBzaGFyZWQgaW1hZ2VzCisJCWZvbGRlckltYWdlID0gbnVsbDsKKwkJdGFza0ltYWdlID0gbnVsbDsKKwkJaWYgKGphckltYWdlICE9IG51bGwpIHsKKwkJCWphckltYWdlLmRpc3Bvc2UoKTsKKwkJCWphckltYWdlID0gbnVsbDsKKwkJfQorCQlpZiAodHlwZUltYWdlICE9IG51bGwpIHsKKwkJCXR5cGVJbWFnZS5kaXNwb3NlKCk7CisJCQl0eXBlSW1hZ2UgPSBudWxsOworCQl9CisJfQorCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVVJMKSB7CisJCQlVUkwgdXJsID0gKFVSTCkgZWxlbWVudDsKKwkJCWlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBmb2xkZXJJbWFnZSgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gamFySW1hZ2UoKTsKKwkJCX0KKwkJfQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKKwkJCXJldHVybiB0YXNrSW1hZ2UoKTsKKwkJfQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFR5cGUpIHsKKwkJCXJldHVybiB0eXBlSW1hZ2UoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVUkwpIHsKKwkJCXJldHVybiAoKFVSTCkgZWxlbWVudCkuZ2V0RmlsZSgpOworCQl9CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFzaykgeworCQkJVGFzayB0YXNrID0gKFRhc2spIGVsZW1lbnQ7CisJCQlyZXR1cm4gdGFzay5nZXRUYXNrTmFtZSgpICsgIiAoIiArIHRhc2suZ2V0TGlicmFyeSgpLmdldEZpbGUoKSArICI6ICIgKyB0YXNrLmdldENsYXNzTmFtZSgpICsgIikiOyAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFR5cGUpIHsKKwkJCVR5cGUgdHlwZSA9IChUeXBlKSBlbGVtZW50OworCQkJcmV0dXJuIHR5cGUuZ2V0VHlwZU5hbWUoKSArICIgKCIgKyB0eXBlLmdldExpYnJhcnkoKS5nZXRGaWxlKCkgKyAiOiAiICsgdHlwZS5nZXRDbGFzc05hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKKwl9CisJcHJpdmF0ZSBJbWFnZSBmb2xkZXJJbWFnZSgpIHsKKwkJaWYgKGZvbGRlckltYWdlICE9IG51bGwpCisJCQlyZXR1cm4gZm9sZGVySW1hZ2U7CisJCWZvbGRlckltYWdlID0KKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCisJCQkJSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7CisJCXJldHVybiBmb2xkZXJJbWFnZTsKKwl9CisJcHJpdmF0ZSBJbWFnZSBqYXJJbWFnZSgpIHsKKwkJaWYgKGphckltYWdlICE9IG51bGwpCisJCQlyZXR1cm4gamFySW1hZ2U7CisJCWphckltYWdlID0KKwkJCUV4dGVybmFsVG9vbHNQbHVnaW4KKwkJCQkuZ2V0RGVmYXVsdCgpCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihFeHRlcm5hbFRvb2xzUGx1Z2luLklNR19KQVJfRklMRSkKKwkJCQkuY3JlYXRlSW1hZ2UoKTsKKwkJcmV0dXJuIGphckltYWdlOworCX0KKwlwcml2YXRlIEltYWdlIHRhc2tJbWFnZSgpIHsKKwkJaWYgKHRhc2tJbWFnZSAhPSBudWxsKQorCQkJcmV0dXJuIHRhc2tJbWFnZTsKKwkJdGFza0ltYWdlID0KKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCisJCQkJSVNoYXJlZEltYWdlcy5JTUdfT0JKU19UQVNLX1RTSyk7CisJCXJldHVybiB0YXNrSW1hZ2U7CisJfQorCXByaXZhdGUgSW1hZ2UgdHlwZUltYWdlKCkgeworCQlpZiAodHlwZUltYWdlICE9IG51bGwpCisJCQlyZXR1cm4gdHlwZUltYWdlOworCQl0eXBlSW1hZ2UgPQorCQkJRXh0ZXJuYWxUb29sc1BsdWdpbgorCQkJCS5nZXREZWZhdWx0KCkKKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEV4dGVybmFsVG9vbHNQbHVnaW4uSU1HX1RZUEUpCisJCQkJLmNyZWF0ZUltYWdlKCk7CisJCXJldHVybiB0eXBlSW1hZ2U7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudFByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1MjhhNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRQcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitUaGlzIGZpbGUgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLkV4dGVybmFsVG9vbHNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLlRvb2xNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7CisKKy8qKgorICogQW50IHByZWZlcmVuY2UgcGFnZSB0byBzZXQgdGhlIGNsYXNzcGF0aCwgdGFza3MsIGFuZCB0eXBlcy4KKyAqLworcHVibGljIGNsYXNzIEFudFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCQorCXByaXZhdGUgQW50Q2xhc3NwYXRoUGFnZSBjbGFzc3BhdGhQYWdlOworCXByaXZhdGUgQW50VGFza3NQYWdlIHRhc2tzUGFnZTsKKwlwcml2YXRlIEFudFR5cGVzUGFnZSB0eXBlc1BhZ2U7CisJCisJLyoqCisJICogQ3JlYXRlcyB0aGUgcHJlZmVyZW5jZSBwYWdlCisJICovCisJcHVibGljIEFudFByZWZlcmVuY2VQYWdlKCkgeworCQlzZXREZXNjcmlwdGlvbihUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRQcmVmZXJlbmNlUGFnZS5kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQlzZXRQcmVmZXJlbmNlU3RvcmUoRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UuCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuQU5UX1BSRUZFUkVOQ0VfUEFHRSk7CisKKwkJVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTk9ORSk7CisJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKworCQljbGFzc3BhdGhQYWdlID0gbmV3IEFudENsYXNzcGF0aFBhZ2UodGhpcyk7CisJCWNsYXNzcGF0aFBhZ2UuY3JlYXRlVGFiSXRlbShmb2xkZXIpOworCQl0YXNrc1BhZ2UgPSBuZXcgQW50VGFza3NQYWdlKHRoaXMpOworCQl0YXNrc1BhZ2UuY3JlYXRlVGFiSXRlbShmb2xkZXIpOworCQl0eXBlc1BhZ2UgPSBuZXcgQW50VHlwZXNQYWdlKHRoaXMpOworCQl0eXBlc1BhZ2UuY3JlYXRlVGFiSXRlbShmb2xkZXIpOworCisJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKKwkJY2xhc3NwYXRoUGFnZS5zZXRJbnB1dChBcnJheXMuYXNMaXN0KHByZWZzLmdldEN1c3RvbVVSTHMoKSkpOworCQl0YXNrc1BhZ2Uuc2V0SW5wdXQoQXJyYXlzLmFzTGlzdChwcmVmcy5nZXRDdXN0b21UYXNrcygpKSk7CisJCXR5cGVzUGFnZS5zZXRJbnB1dChBcnJheXMuYXNMaXN0KHByZWZzLmdldEN1c3RvbVR5cGVzKCkpKTsKKworCQlyZXR1cm4gZm9sZGVyOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKKwkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7CisJCQorCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7CisJCWNsYXNzcGF0aFBhZ2Uuc2V0SW5wdXQoQXJyYXlzLmFzTGlzdChwcmVmcy5nZXREZWZhdWx0Q3VzdG9tVVJMcygpKSk7CisJCXRhc2tzUGFnZS5zZXRJbnB1dChBcnJheXMuYXNMaXN0KHByZWZzLmdldEN1c3RvbVRhc2tzKCkpKTsKKwkJdHlwZXNQYWdlLnNldElucHV0KEFycmF5cy5hc0xpc3QocHJlZnMuZ2V0Q3VzdG9tVHlwZXMoKSkpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKKwkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQkKKwkJTGlzdCBjb250ZW50cyA9IGNsYXNzcGF0aFBhZ2UuZ2V0Q29udGVudHMoKTsKKwkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKKwkJCVVSTFtdIHVybHMgPSAoVVJMW10pIGNvbnRlbnRzLnRvQXJyYXkobmV3IFVSTFtjb250ZW50cy5zaXplKCldKTsKKwkJCXByZWZzLnNldEN1c3RvbVVSTHModXJscyk7CisJCX0KKwkJCisJCWNvbnRlbnRzID0gdGFza3NQYWdlLmdldENvbnRlbnRzKCk7CisJCWlmIChjb250ZW50cyAhPSBudWxsKSB7CisJCQlUYXNrW10gdGFza3MgPSAoVGFza1tdKSBjb250ZW50cy50b0FycmF5KG5ldyBUYXNrW2NvbnRlbnRzLnNpemUoKV0pOworCQkJcHJlZnMuc2V0Q3VzdG9tVGFza3ModGFza3MpOworCQl9CisJCQorCQljb250ZW50cyA9IHR5cGVzUGFnZS5nZXRDb250ZW50cygpOworCQlpZiAoY29udGVudHMgIT0gbnVsbCkgeworCQkJVHlwZVtdIHR5cGVzID0gKFR5cGVbXSkgY29udGVudHMudG9BcnJheShuZXcgVHlwZVtjb250ZW50cy5zaXplKCldKTsKKwkJCXByZWZzLnNldEN1c3RvbVR5cGVzKHR5cGVzKTsKKwkJfQorCQkKKwkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSA8Y29kZT5HcmlkRGF0YTwvY29kZT4gb24gdGhlIHNwZWNpZmllZCBidXR0b24gdG8KKwkgKiBiZSBvbmUgdGhhdCBpcyBzcGFjZWQgZm9yIHRoZSBjdXJyZW50IGRpYWxvZyBwYWdlIHVuaXRzLgorCSAqIAorCSAqIEBwYXJhbSBidXR0b24gdGhlIGJ1dHRvbiB0byBzZXQgdGhlIDxjb2RlPkdyaWREYXRhPC9jb2RlPgorCSAqIEByZXR1cm4gdGhlIDxjb2RlPkdyaWREYXRhPC9jb2RlPiBzZXQgb24gdGhlIHNwZWNpZmllZCBidXR0b24KKwkgKi8KKwkvKnBhY2thZ2UqLyBHcmlkRGF0YSBzZXRCdXR0b25HcmlkRGF0YShCdXR0b24gYnV0dG9uKSB7CisJCXJldHVybiBzZXRCdXR0b25MYXlvdXREYXRhKGJ1dHRvbik7CisJfQorCQorCXByb3RlY3RlZCBMaXN0IGdldExpYnJhcnlVUkxzKCkgeworCQlyZXR1cm4gY2xhc3NwYXRoUGFnZS5nZXRDb250ZW50cygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50UnVuQWN0aW9uRGVsZWdhdGUuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRSdW5BY3Rpb25EZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNDhiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50UnVuQWN0aW9uRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDU3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7CisKKy8qKgorICogQWN0aW9uIGRlbGVnYXRlIHRvIGxhdW5jaCBBbnQgb24gYSBidWlsZCBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgQW50UnVuQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7CisJcHJpdmF0ZSBJRmlsZSBzZWxlY3RlZEZpbGU7CisJcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBwYXJ0OworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uRGVsZWdhdGUuCisJICovCisJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisJCWlmIChwYXJ0ICE9IG51bGwgJiYgc2VsZWN0ZWRGaWxlICE9IG51bGwpIHsKKwkJCW5ldyBBbnRBY3Rpb24oc2VsZWN0ZWRGaWxlLCBwYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSkucnVuKCk7CisJCX0KKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uRGVsZWdhdGUuCisJICovCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJc2VsZWN0ZWRGaWxlID0gbnVsbDsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247CisJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMSkgeworCQkJCU9iamVjdCBzZWxlY3RlZFJlc291cmNlID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQorCQkJCQlzZWxlY3RlZEZpbGUgPSAoSUZpbGUpIHNlbGVjdGVkUmVzb3VyY2U7CisJCQl9CisJCX0KKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJT2JqZWN0QWN0aW9uRGVsZWdhdGUuCisJICovCisJcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgeworCQl0aGlzLnBhcnQgPSB0YXJnZXRQYXJ0OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50VGFyZ2V0Q29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50VGFyZ2V0Q29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzNGI2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRUYXJnZXRDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS5BbnRUYXJnZXRMaXN0OworCisvKioKKyAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRhcmdldHMgd2l0aGluIGFuIEFudCBmaWxlCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRUYXJnZXRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJLyoqCisJICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIuCisJICovCisJcHVibGljIEFudFRhcmdldENvbnRlbnRQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLgorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKKwkJQW50VGFyZ2V0TGlzdCB0YXJnZXRMaXN0ID0gKEFudFRhcmdldExpc3QpIGlucHV0OworCQlyZXR1cm4gdGFyZ2V0TGlzdC5nZXRUYXJnZXRzKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udGVudFByb3ZpZGVyLgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQ29udGVudFByb3ZpZGVyLgorCSAqLworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50VGFyZ2V0TGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudFRhcmdldExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmZkYzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudFRhcmdldExhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmUuVG9vbE1lc3NhZ2VzOworCisvKioKKyAqIEFudCB0YXJnZXQgbGFiZWwgcHJvdmlkZXIKKyAqLworcHVibGljIGNsYXNzIEFudFRhcmdldExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKKwlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZFRhcmdldHMgPSBudWxsOworCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUYXJnZXROYW1lID0gbnVsbDsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUxhYmVsUHJvdmlkZXIuCisJICovCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBtb2RlbCkgeworCQlTdHJpbmcgdGFyZ2V0VG9EaXNwbGF5ID0gKFN0cmluZykgbW9kZWw7CisJCWlmICh0YXJnZXRUb0Rpc3BsYXkgIT0gbnVsbCkgeworCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodGFyZ2V0VG9EaXNwbGF5KTsKKwkJCWlmICh0YXJnZXRUb0Rpc3BsYXkuZXF1YWxzKGRlZmF1bHRUYXJnZXROYW1lKSkgeworCQkJCXJlc3VsdC5hcHBlbmQoIiAoIik7IC8vJE5PTi1OTFMtMSQ7CisJCQkJcmVzdWx0LmFwcGVuZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRUYXJnZXRMYWJlbFByb3ZpZGVyLmRlZmF1bHRUYXJnZXQiKSk7IC8vJE5PTi1OTFMtMSQ7CisJCQkJcmVzdWx0LmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkOworCQkJfQorCQkJaWYgKHNlbGVjdGVkVGFyZ2V0cyAhPSBudWxsKSB7CisJCQkJaW50IHRhcmdldEluZGV4ID0gc2VsZWN0ZWRUYXJnZXRzLmluZGV4T2YodGFyZ2V0VG9EaXNwbGF5KTsKKwkJCQlpZiAodGFyZ2V0SW5kZXggPj0gMCkgeworCQkJCQlyZXN1bHQuYXBwZW5kKCIgWyIpOyAvLyROT04tTkxTLTEkOworCQkJCQlyZXN1bHQuYXBwZW5kKHRhcmdldEluZGV4ICsgMSk7CisJCQkJCXJlc3VsdC5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gIiI7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB0YXJnZXRzIHNlbGVjdGVkIGluIHRoZSB2aWV3ZXIuCisJICovCisJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRUYXJnZXRzKEFycmF5TGlzdCB2YWx1ZSkgeworCQlzZWxlY3RlZFRhcmdldHMgPSB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHRhcmdldAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXJnZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWRlZmF1bHRUYXJnZXROYW1lID0gbmFtZTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50VGFza3NQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50VGFza3NQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzNDI0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9BbnRUYXNrc1BhZ2UuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorVGhpcyBmaWxlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlRhc2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS5Ub29sTWVzc2FnZXM7CisKKy8qKgorICogU3ViLXBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgY3VzdG9tIHRhc2tzCisgKiB0byBiZSB1c2VkIHdoZW4gcnVubmluZyBBbnQgYnVpbGQgZmlsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRUYXNrc1BhZ2UgZXh0ZW5kcyBBbnRQYWdlIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX1RBU0tfQlVUVE9OID0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAxOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRElUX1RBU0tfQlVUVE9OID0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAyOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfQlVUVE9OID0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAzOworCisJcHJpdmF0ZSBmaW5hbCBBbnRUYXNrc0xhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBbnRUYXNrc0xhYmVsUHJvdmlkZXIoKTsKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBBbnRUYXNrc1BhZ2UoQW50UHJlZmVyZW5jZVBhZ2UgcHJlZmVyZW5jZVBhZ2UpIHsKKwkJc3VwZXIocHJlZmVyZW5jZVBhZ2UpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFudFBhZ2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQnV0dG9uc1RvQnV0dG9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgeworCQljcmVhdGVCdXR0b24ocGFyZW50LCAiQW50VGFza3NQYWdlLmFkZFRhc2tCdXR0b25UaXRsZSIsIEFERF9UQVNLX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKKwkJZWRpdEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsICJBbnRUYXNrc1BhZ2UuZWRpdFRhc2tCdXR0b25UaXRsZSIsIEVESVRfVEFTS19CVVRUT04pOyAvLyROT04tTkxTLTEkCisJCWNyZWF0ZVNlcGFyYXRvcihwYXJlbnQpOworCQlyZW1vdmVCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCAiQW50VGFza3NQYWdlLnJlbW92ZUJ1dHRvblRpdGxlIiwgUkVNT1ZFX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyoqCisJICogQWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGEgY3VzdG9tIHRhc2suCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZFRhc2tCdXR0b25QcmVzc2VkKCkgeworCQlTdHJpbmcgdGl0bGUgPSBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRUYXNrc1BhZ2UuYWRkVGFza0RpYWxvZ1RpdGxlIik7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIG1zZyA9IFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkFudFRhc2tzUGFnZS5hZGRUYXNrRGlhbG9nRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAorCQlBZGRDdXN0b21EaWFsb2cgZGlhbG9nID0gbmV3IEFkZEN1c3RvbURpYWxvZyhnZXRTaGVsbCgpLCBnZXRQcmVmZXJlbmNlUGFnZSgpLmdldExpYnJhcnlVUkxzKCksIHRpdGxlLCBtc2cpOworCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKQorCQkJcmV0dXJuOworCisJCVRhc2sgdGFzayA9IG5ldyBUYXNrKCk7CisJCXRhc2suc2V0VGFza05hbWUoZGlhbG9nLmdldFRhc2tOYW1lKCkpOworCQl0YXNrLnNldENsYXNzTmFtZShkaWFsb2cuZ2V0Q2xhc3NOYW1lKCkpOworCQl0YXNrLnNldExpYnJhcnkoZGlhbG9nLmdldExpYnJhcnkoKSk7CisJCWFkZENvbnRlbnQodGFzayk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQW50UGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgeworCQlzd2l0Y2ggKGJ1dHRvbklkKSB7CisJCQljYXNlIEFERF9UQVNLX0JVVFRPTiA6CisJCQkJYWRkVGFza0J1dHRvblByZXNzZWQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRURJVF9UQVNLX0JVVFRPTiA6CisJCQkJZWRpdFRhc2tCdXR0b25QcmVzc2VkKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFTU9WRV9CVVRUT04gOgorCQkJCXJlbW92ZUJ1dHRvblByZXNzZWQoKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSB0YWIgaXRlbSB0aGF0IGNvbnRhaW5zIHRoaXMgc3ViLXBhZ2UuCisJICovCisJcHVibGljIFRhYkl0ZW0gY3JlYXRlVGFiSXRlbShUYWJGb2xkZXIgZm9sZGVyKSB7CisJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOworCQlpdGVtLnNldFRleHQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQW50VGFza3NQYWdlLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCWl0ZW0uc2V0SW1hZ2UobGFiZWxQcm92aWRlci5nZXRUYXNrSW1hZ2UoKSk7CisJCWl0ZW0uc2V0RGF0YSh0aGlzKTsKKwkJaXRlbS5zZXRDb250cm9sKGNyZWF0ZUNvbnRyb2woZm9sZGVyKSk7CisJCXJldHVybiBpdGVtOworCX0KKworCS8qKgorCSAqIEFsbG93cyB0aGUgdXNlciB0byBlZGl0IGEgY3VzdG9tIEFudCB0YXNrLgorCSAqLwkKKwlwcml2YXRlIHZvaWQgZWRpdFRhc2tCdXR0b25QcmVzc2VkKCkgeworCQlTdHJpbmcgdGl0bGUgPSBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRUYXNrc1BhZ2UuZWRpdFRhc2tEaWFsb2dUaXRsZSIpOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBtc2cgPSBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRUYXNrc1BhZ2UuZWRpdFRhc2tEaWFsb2dEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCUFkZEN1c3RvbURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkQ3VzdG9tRGlhbG9nKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlKCkuZ2V0TGlicmFyeVVSTHMoKSwgdGl0bGUsIG1zZyk7CisJCVRhc2sgdGFzayA9IChUYXNrKSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJaWYgKHRhc2sgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJZGlhbG9nLnNldENsYXNzTmFtZSh0YXNrLmdldENsYXNzTmFtZSgpKTsKKwkJZGlhbG9nLnNldFRhc2tOYW1lKHRhc2suZ2V0VGFza05hbWUoKSk7CisJCWRpYWxvZy5zZXRMaWJyYXJ5KHRhc2suZ2V0TGlicmFyeSgpKTsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKKwkJCXJldHVybjsKKworCQl0YXNrLnNldFRhc2tOYW1lKGRpYWxvZy5nZXRUYXNrTmFtZSgpKTsKKwkJdGFzay5zZXRDbGFzc05hbWUoZGlhbG9nLmdldENsYXNzTmFtZSgpKTsKKwkJdGFzay5zZXRMaWJyYXJ5KGRpYWxvZy5nZXRMaWJyYXJ5KCkpOworCQl1cGRhdGVDb250ZW50KHRhc2spOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFudFBhZ2UuCisJICovCisJcHJvdGVjdGVkIElUYWJsZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBbnRQYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHRhYmxlU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKKwkJaW50IHNpemUgPSBuZXdTZWxlY3Rpb24uc2l6ZSgpOworCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoc2l6ZSA9PSAxKTsKKwkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoc2l6ZSA+IDApOworCX0KKwkKKwkKKwkvKioKKwkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGFzayBlbGVtZW50cworCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEFudFRhc2tzTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKKwkJcHJpdmF0ZSBJbWFnZSB0YXNrSW1hZ2U7CisJCisJCS8qKgorCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCQkgKi8KKwkJcHVibGljIEFudFRhc2tzTGFiZWxQcm92aWRlcigpIHsKKwkJfQorCQkKKwkJLyogKG5vbi1KYXZhZG9jKQorCQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUJhc2VMYWJlbFByb3ZpZGVyLgorCQkgKi8KKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCS8vIFRhc2sgaW1hZ2UgaXMgc2hhcmVkLCBkbyBub3QgZGlzcG9zZS4KKwkJCXRhc2tJbWFnZSA9IG51bGw7CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogTWV0aG9kIGRlY2xhcmVkIG9uIElUYWJsZUxhYmVsUHJvdmlkZXIuCisJCSAqLworCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJcmV0dXJuIGdldFRhc2tJbWFnZSgpOworCQl9CisJCQorCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJVGFibGVMYWJlbFByb3ZpZGVyLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCVRhc2sgdGFzayA9IChUYXNrKSBlbGVtZW50OworCQkJcmV0dXJuIHRhc2suZ2V0VGFza05hbWUoKSArICIgKCIgKyB0YXNrLmdldExpYnJhcnkoKS5nZXRGaWxlKCkgKyAiOiAiICsgdGFzay5nZXRDbGFzc05hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCX0KKwkJCisJCXB1YmxpYyBJbWFnZSBnZXRUYXNrSW1hZ2UoKSB7CisJCQlpZiAodGFza0ltYWdlID09IG51bGwpCisJCQkJdGFza0ltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1RBU0tfVFNLKTsKKwkJCXJldHVybiB0YXNrSW1hZ2U7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudFR5cGVzUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0FudFR5cGVzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZGVmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQW50VHlwZXNQYWdlLmphdmEKQEAgLTAsMCArMSwxODcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK1RoaXMgZmlsZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmUuRXh0ZXJuYWxUb29sc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmUuVG9vbE1lc3NhZ2VzOworCisvKioKKyAqIFN1Yi1wYWdlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGN1c3RvbSB0eXBlcworICogdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgQW50IGJ1aWxkIGZpbGVzLgorICovCitwdWJsaWMgY2xhc3MgQW50VHlwZXNQYWdlIGV4dGVuZHMgQW50UGFnZSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9UWVBFX0JVVFRPTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9UWVBFX0JVVFRPTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0JVVFRPTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMzsKKworCXByaXZhdGUgZmluYWwgQW50VHlwZXNMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQW50VHlwZXNMYWJlbFByb3ZpZGVyKCk7CisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgQW50VHlwZXNQYWdlKEFudFByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7CisJCXN1cGVyKHByZWZlcmVuY2VQYWdlKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBbnRQYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEJ1dHRvbnNUb0J1dHRvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJY3JlYXRlQnV0dG9uKHBhcmVudCwgIkFudFR5cGVzUGFnZS5hZGRUeXBlQnV0dG9uVGl0bGUiLCBBRERfVFlQRV9CVVRUT04pOyAvLyROT04tTkxTLTEkCisJCWVkaXRCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCAiQW50VHlwZXNQYWdlLmVkaXRUeXBlQnV0dG9uVGl0bGUiLCBFRElUX1RZUEVfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAorCQljcmVhdGVTZXBhcmF0b3IocGFyZW50KTsKKwkJcmVtb3ZlQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgIkFudFR5cGVzUGFnZS5yZW1vdmVCdXR0b25UaXRsZSIsIFJFTU9WRV9CVVRUT04pOyAvLyROT04tTkxTLTEkCisJfQorCQorCS8qKgorCSAqIEFsbG93cyB0aGUgdXNlciB0byBlbnRlciBhIGN1c3RvbSB0eXBlLgorCSAqLworCXByaXZhdGUgdm9pZCBhZGRUeXBlQnV0dG9uUHJlc3NlZCgpIHsKKwkJU3RyaW5nIHRpdGxlID0gVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQW50VHlwZXNQYWdlLmFkZFR5cGVEaWFsb2dUaXRsZSIpOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBtc2cgPSBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRUeXBlc1BhZ2UuYWRkVHlwZURpYWxvZ0Rlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRDdXN0b21EaWFsb2coZ2V0U2hlbGwoKSwgZ2V0UHJlZmVyZW5jZVBhZ2UoKS5nZXRMaWJyYXJ5VVJMcygpLCB0aXRsZSwgbXNnKTsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJVHlwZSB0eXBlID0gbmV3IFR5cGUoKTsKKwkJdHlwZS5zZXRUeXBlTmFtZShkaWFsb2cuZ2V0VGFza05hbWUoKSk7CisJCXR5cGUuc2V0Q2xhc3NOYW1lKGRpYWxvZy5nZXRDbGFzc05hbWUoKSk7CisJCXR5cGUuc2V0TGlicmFyeShkaWFsb2cuZ2V0TGlicmFyeSgpKTsKKwkJYWRkQ29udGVudCh0eXBlKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBbnRQYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7CisJCXN3aXRjaCAoYnV0dG9uSWQpIHsKKwkJCWNhc2UgQUREX1RZUEVfQlVUVE9OIDoKKwkJCQlhZGRUeXBlQnV0dG9uUHJlc3NlZCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBFRElUX1RZUEVfQlVUVE9OIDoKKwkJCQllZGl0VHlwZUJ1dHRvblByZXNzZWQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVNT1ZFX0JVVFRPTiA6CisJCQkJcmVtb3ZlQnV0dG9uUHJlc3NlZCgpOworCQkJCWJyZWFrOworCQl9CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIHRhYiBpdGVtIHRoYXQgY29udGFpbnMgdGhpcyBzdWItcGFnZS4KKwkgKi8KKwlwdWJsaWMgVGFiSXRlbSBjcmVhdGVUYWJJdGVtKFRhYkZvbGRlciBmb2xkZXIpIHsKKwkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7CisJCWl0ZW0uc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRUeXBlc1BhZ2UudHlwZXNQYWdlVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJaXRlbS5zZXRJbWFnZShsYWJlbFByb3ZpZGVyLmdldFR5cGVJbWFnZSgpKTsKKwkJaXRlbS5zZXREYXRhKHRoaXMpOworCQlpdGVtLnNldENvbnRyb2woY3JlYXRlQ29udHJvbChmb2xkZXIpKTsKKwkJcmV0dXJuIGl0ZW07CisJfQorCQorCS8qKgorCSAqIEFsbG93cyB0aGUgdXNlciB0byBlZGl0IGEgY3VzdG9tIEFudCB0eXBlLgorCSAqLwkKKwlwcml2YXRlIHZvaWQgZWRpdFR5cGVCdXR0b25QcmVzc2VkKCkgeworCQlTdHJpbmcgdGl0bGUgPSBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRUeXBlc1BhZ2UuZWRpdFR5cGVEaWFsb2dUaXRsZSIpOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBtc2cgPSBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRUeXBlc1BhZ2UuZWRpdFR5cGVEaWFsb2dEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCUFkZEN1c3RvbURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkQ3VzdG9tRGlhbG9nKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlKCkuZ2V0TGlicmFyeVVSTHMoKSwgdGl0bGUsIG1zZyk7CisJCVR5cGUgdHlwZSA9IChUeXBlKSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJaWYgKHR5cGUgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJZGlhbG9nLnNldENsYXNzTmFtZSh0eXBlLmdldENsYXNzTmFtZSgpKTsKKwkJZGlhbG9nLnNldFRhc2tOYW1lKHR5cGUuZ2V0VHlwZU5hbWUoKSk7CisJCWRpYWxvZy5zZXRMaWJyYXJ5KHR5cGUuZ2V0TGlicmFyeSgpKTsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJdHlwZS5zZXRUeXBlTmFtZShkaWFsb2cuZ2V0VGFza05hbWUoKSk7CisJCXR5cGUuc2V0Q2xhc3NOYW1lKGRpYWxvZy5nZXRDbGFzc05hbWUoKSk7CisJCXR5cGUuc2V0TGlicmFyeShkaWFsb2cuZ2V0TGlicmFyeSgpKTsKKwkJdXBkYXRlQ29udGVudCh0eXBlKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBbnRQYWdlLgorCSAqLworCXByb3RlY3RlZCBJVGFibGVMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7CisJCXJldHVybiBsYWJlbFByb3ZpZGVyOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQW50UGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7CisJCWludCBzaXplID0gbmV3U2VsZWN0aW9uLnNpemUoKTsKKwkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHNpemUgPT0gMSk7CisJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHNpemUgPiAwKTsKKwl9CisKKworCS8qKgorCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0eXBlIGVsZW1lbnRzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQW50VHlwZXNMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1RZUEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZiI7IC8vJE5PTi1OTFMtMSQ7CisJCXByaXZhdGUgSW1hZ2UgdHlwZUltYWdlOworCQorCQkvKioKKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KKwkJICovCisJCXB1YmxpYyBBbnRUeXBlc0xhYmVsUHJvdmlkZXIoKSB7CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogTWV0aG9kIGRlY2xhcmVkIG9uIElCYXNlTGFiZWxQcm92aWRlci4KKwkJICovCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQlpZiAodHlwZUltYWdlICE9IG51bGwpIHsKKwkJCQl0eXBlSW1hZ2UuZGlzcG9zZSgpOworCQkJCXR5cGVJbWFnZSA9IG51bGw7CisJCQl9CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogTWV0aG9kIGRlY2xhcmVkIG9uIElUYWJsZUxhYmVsUHJvdmlkZXIuCisJCSAqLworCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJcmV0dXJuIGdldFR5cGVJbWFnZSgpOworCQl9CisJCQorCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJVGFibGVMYWJlbFByb3ZpZGVyLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCVR5cGUgdHlwZSA9IChUeXBlKSBlbGVtZW50OworCQkJcmV0dXJuIHR5cGUuZ2V0VHlwZU5hbWUoKSArICIgKCIgKyB0eXBlLmdldExpYnJhcnkoKS5nZXRGaWxlKCkgKyAiOiAiICsgdHlwZS5nZXRDbGFzc05hbWUoKSArICIpIjsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCX0KKwkJCisJCXB1YmxpYyBJbWFnZSBnZXRUeXBlSW1hZ2UoKSB7CisJCQlpZiAodHlwZUltYWdlID09IG51bGwpIHsKKwkJCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfVFlQRSk7CisJCQkJdHlwZUltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOworCQkJfQorCQkJcmV0dXJuIHR5cGVJbWFnZTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvQnVpbGRlclByb3BlcnR5UGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0J1aWxkZXJQcm9wZXJ0eVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2JmMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0J1aWxkZXJQcm9wZXJ0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDQwMSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmUuKjsKKworLyoqCisgKiBQcm9wZXJ0eSBwYWdlIHRvIGFkZCBleHRlcm5hbCB0b29scyBpbiBiZXR3ZWVuIGJ1aWxkZXJzLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQnVpbGRlclByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVSUxERVJfVEFCTEVfV0lEVEggPSAyNTA7CisKKwlwcml2YXRlIFRhYmxlIGJ1aWxkZXJUYWJsZTsKKwlwcml2YXRlIEJ1dHRvbiB1cEJ1dHRvbiwgZG93bkJ1dHRvbiwgbmV3QnV0dG9uLCBlZGl0QnV0dG9uLCByZW1vdmVCdXR0b247CisJcHJpdmF0ZSBBcnJheUxpc3QgaW1hZ2VzVG9EaXNwb3NlID0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgSW1hZ2UgYW50SW1hZ2UsIGJ1aWxkZXJJbWFnZSwgZXh0ZXJuYWxUb29sSW1hZ2UsIGludmFsaWRCdWlsZFRvb2xJbWFnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5pdGlhbGl6ZWQgcHJvcGVydHkgcGFnZQorCSAqLworCXB1YmxpYyBCdWlsZGVyUHJvcGVydHlQYWdlKCkgeworCQlzdXBlcigpOworCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOworCX0KKworCS8qKgorCSAqIEFkZCB0aGUgcHJvamVjdCdzIGJ1aWxkIHRvIHRoZSB0YWJsZSB2aWV3ZXIuCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZEJ1aWxkZXJzVG9UYWJsZSgpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldElucHV0UHJvamVjdCgpOworCQlpZiAocHJvamVjdCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLy9hZGQgYnVpbGQgc3BlYyBlbnRyaWVzIHRvIHRoZSB0YWJsZQorCQl0cnkgeworCQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXRCdWlsZFNwZWMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHsKKwkJCQlhZGRDb21tYW5kKGNvbW1hbmRzW2ldLCAtMSwgZmFsc2UpOworCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBBZGRzIGEgYnVpbGQgY29tbWFuZCB0byB0aGUgdGFibGUgdmlld2VyLgorCSAqIAorCSAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIGJlIGFkZGVkCisJICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpbnNlcnRpb24gcG9zaXRpb24sIG9yIC0xIHRvIGFkZCBhdCB0aGUgZW5kCisJICogQHBhcmFtIHNlbGVjdCB3aGV0aGVyIHRvIHNlbGVjdCB0aGUgbmV3bHkgY3JlYXRlZCBpdGVtLgorCSAqLworCXByaXZhdGUgdm9pZCBhZGRDb21tYW5kKElDb21tYW5kIGNvbW1hbmQsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBzZWxlY3QpIHsKKwkJVGFibGVJdGVtIG5ld0l0ZW07CisJCWlmIChwb3NpdGlvbiA8IDApIHsKKwkJCW5ld0l0ZW0gPSBuZXcgVGFibGVJdGVtKGJ1aWxkZXJUYWJsZSwgU1dULk5PTkUpOworCQl9IGVsc2UgeworCQkJbmV3SXRlbSA9IG5ldyBUYWJsZUl0ZW0oYnVpbGRlclRhYmxlLCBTV1QuTk9ORSwgcG9zaXRpb24pOworCQl9CisJCW5ld0l0ZW0uc2V0RGF0YShjb21tYW5kKTsKKwkJdXBkYXRlQ29tbWFuZEl0ZW0obmV3SXRlbSwgY29tbWFuZCk7CisJCWlmIChzZWxlY3QpIGJ1aWxkZXJUYWJsZS5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworCX0KKwkKKwkvKioKKwkgKiBDb25maWd1cmVzIGFuZCBjcmVhdGVzIGEgbmV3IGJ1aWxkIGNvbW1hbmQKKwkgKiB0aGF0IGludm9rZXMgYW4gZXh0ZXJuYWwgdG9vbC4gIFJldHVybnMgdGhlIG5ldyBjb21tYW5kLAorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbW1hbmQgd2FzIGNyZWF0ZWQuCisJICovCisJcHJpdmF0ZSBJQ29tbWFuZCBjcmVhdGVUb29sKCkgeworCQl0cnkgeworCQkJRWRpdERpYWxvZyBkaWFsb2c7CisJCQlkaWFsb2cgPSBuZXcgRWRpdERpYWxvZyhnZXRTaGVsbCgpLCBudWxsKTsKKwkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgeworCQkJCUV4dGVybmFsVG9vbCB0b29sID0gZGlhbG9nLmdldEV4dGVybmFsVG9vbCgpOworCQkJCUlDb21tYW5kIGNvbW1hbmQgPSBnZXRJbnB1dFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpLm5ld0NvbW1hbmQoKTsKKwkJCQlyZXR1cm4gdG9vbC50b0J1aWxkQ29tbWFuZChjb21tYW5kKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG51bGw7CQorCQkJfQorCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgeworCQkJaGFuZGxlRXhjZXB0aW9uKGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0JCQorCX0KKwkKKwkvKioKKwkgKiBFZGl0cyBhbiBleGlzaXRpbmcgYnVpbGQgY29tbWFuZCB0aGF0IGludm9rZXMgYW4gZXh0ZXJuYWwgdG9vbC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgZWRpdFRvb2woSUNvbW1hbmQgY29tbWFuZCkgeworCQlFeHRlcm5hbFRvb2wgdG9vbCA9IEV4dGVybmFsVG9vbC5mcm9tQXJndW1lbnRNYXAoY29tbWFuZC5nZXRBcmd1bWVudHMoKSk7CisJCWlmICh0b29sID09IG51bGwpCisJCQlyZXR1cm47CisJCUVkaXREaWFsb2cgZGlhbG9nOworCQlkaWFsb2cgPSBuZXcgRWRpdERpYWxvZyhnZXRTaGVsbCgpLCB0b29sKTsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisJCQl0b29sID0gZGlhbG9nLmdldEV4dGVybmFsVG9vbCgpOworCQkJdG9vbC50b0J1aWxkQ29tbWFuZChjb21tYW5kKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgYnV0dG9uIHdpdGggdGhlIGdpdmVuIGxhYmVsLCBpZCwgYW5kIGVuYWJsZW1lbnQuCisJICovCisJcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgeworCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKKwkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX0hFSUdIVCk7CisJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOyAKKwkJYnV0dG9uLnNldFRleHQobGFiZWwpOworCQlidXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVCdXR0b25QcmVzc2VkKChCdXR0b24pZS53aWRnZXQpOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIGJ1dHRvbjsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCWV4dGVybmFsVG9vbEltYWdlID0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEV4dGVybmFsVG9vbHNQbHVnaW4uSU1HX0VYVEVSTkFMX1RPT0wpLmNyZWF0ZUltYWdlKCk7CisJCWFudEltYWdlID0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEV4dGVybmFsVG9vbHNQbHVnaW4uSU1HX0FOVF9UT09MKS5jcmVhdGVJbWFnZSgpOworCQlidWlsZGVySW1hZ2UgPSBFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoRXh0ZXJuYWxUb29sc1BsdWdpbi5JTUdfQlVJTERFUikuY3JlYXRlSW1hZ2UoKTsKKwkJaW52YWxpZEJ1aWxkVG9vbEltYWdlID0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEV4dGVybmFsVG9vbHNQbHVnaW4uSU1HX0lOVkFMSURfQlVJTERfVE9PTCkuY3JlYXRlSW1hZ2UoKTsKKworCQlpbWFnZXNUb0Rpc3Bvc2UuYWRkKGV4dGVybmFsVG9vbEltYWdlKTsKKwkJaW1hZ2VzVG9EaXNwb3NlLmFkZChhbnRJbWFnZSk7CisJCWltYWdlc1RvRGlzcG9zZS5hZGQoYnVpbGRlckltYWdlKTsKKwkJaW1hZ2VzVG9EaXNwb3NlLmFkZChpbnZhbGlkQnVpbGRUb29sSW1hZ2UpOworCQkKKwkJQ29tcG9zaXRlIHRvcExldmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJdG9wTGV2ZWwuc2V0TGF5b3V0KGxheW91dCk7CisJCXRvcExldmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQkKKwkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwodG9wTGV2ZWwsIFNXVC5XUkFQKTsKKwkJZGVzY3JpcHRpb24uc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJCdWlsZGVyUHJvcGVydHlQYWdlLmRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQorCQlDb21wb3NpdGUgdGFibGVBbmRCdXR0b25zID0gbmV3IENvbXBvc2l0ZSh0b3BMZXZlbCwgU1dULk5PTkUpOworCQl0YWJsZUFuZEJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCXRhYmxlQW5kQnV0dG9ucy5zZXRMYXlvdXQobGF5b3V0KTsKKwkKKwkJLy8gdGFibGUgb2YgYnVpbGRlcnMgYW5kIHRvb2xzCQkKKwkJYnVpbGRlclRhYmxlID0gbmV3IFRhYmxlKHRhYmxlQW5kQnV0dG9ucywgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWRhdGEud2lkdGhIaW50ID0gQlVJTERFUl9UQUJMRV9XSURUSDsKKwkJYnVpbGRlclRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CisJCWJ1aWxkZXJUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVUYWJsZVNlbGVjdGlvbkNoYW5nZWQoKTsKKwkJCX0KKwkJfSk7CisJCQorCQkvL2J1dHRvbiBhcmVhCisJCUNvbXBvc2l0ZSBidXR0b25BcmVhID0gbmV3IENvbXBvc2l0ZSh0YWJsZUFuZEJ1dHRvbnMsIFNXVC5OT05FKTsKKwkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWJ1dHRvbkFyZWEuc2V0TGF5b3V0KGxheW91dCk7CisJCWJ1dHRvbkFyZWEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOworCQluZXdCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQXJlYSwgVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQnVpbGRlclByb3BlcnR5UGFnZS5uZXdCdXR0b24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJZWRpdEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihidXR0b25BcmVhLCBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJCdWlsZGVyUHJvcGVydHlQYWdlLmVkaXRCdXR0b24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcmVtb3ZlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkFyZWEsIFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkJ1aWxkZXJQcm9wZXJ0eVBhZ2UucmVtb3ZlQnV0dG9uIikpOyAvLyROT04tTkxTLTEkCisJCW5ldyBMYWJlbChidXR0b25BcmVhLCBTV1QuTEVGVCk7CisJCXVwQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkFyZWEsIFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkJ1aWxkZXJQcm9wZXJ0eVBhZ2UudXBCdXR0b24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJZG93bkJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihidXR0b25BcmVhLCBUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJCdWlsZGVyUHJvcGVydHlQYWdlLmRvd25CdXR0b24iKSk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJbmV3QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJCQorCQkvL3BvcHVsYXRlIHdpZGdldCBjb250ZW50cwkKKwkJYWRkQnVpbGRlcnNUb1RhYmxlKCk7CisJCQorCQlyZXR1cm4gdG9wTGV2ZWw7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nUGFnZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJCWZvciAoSXRlcmF0b3IgaSA9IGltYWdlc1RvRGlzcG9zZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpLm5leHQoKTsKKwkJCWltYWdlLmRpc3Bvc2UoKTsKKwkJfQorCQlpbWFnZXNUb0Rpc3Bvc2UuY2xlYXIoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGlzIHRoZSBpbnB1dCBmb3IgdGhpcyBwcm9wZXJ0eSBwYWdlLAorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByaXZhdGUgSVByb2plY3QgZ2V0SW5wdXRQcm9qZWN0KCkgeworCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCXJldHVybiAoSVByb2plY3QpZWxlbWVudDsKKwkJfQorCQlPYmplY3QgcmVzb3VyY2UgPSBlbGVtZW50LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKKwkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCXJldHVybiAoSVByb2plY3QpcmVzb3VyY2U7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIE9uZSBvZiB0aGUgYnV0dG9ucyBoYXMgYmVlbiBwcmVzc2VkLCBhY3QgYWNjb3JkaW5nbHkuCisJICovCisJcHJpdmF0ZSB2b2lkIGhhbmRsZUJ1dHRvblByZXNzZWQoQnV0dG9uIGJ1dHRvbikgeworCQlpZiAoYnV0dG9uID09IG5ld0J1dHRvbikgeworCQkJSUNvbW1hbmQgbmV3Q29tbWFuZCA9IGNyZWF0ZVRvb2woKTsKKwkJCWlmIChuZXdDb21tYW5kICE9IG51bGwpIHsKKwkJCQlpbnQgaW5zZXJ0UG9zaXRpb24gPSBidWlsZGVyVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSArIDE7CisJCQkJYWRkQ29tbWFuZChuZXdDb21tYW5kLCBpbnNlcnRQb3NpdGlvbiwgdHJ1ZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoYnV0dG9uID09IGVkaXRCdXR0b24pIHsKKwkJCVRhYmxlSXRlbVtdIHNlbGVjdGlvbiA9IGJ1aWxkZXJUYWJsZS5nZXRTZWxlY3Rpb24oKTsKKwkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgeworCQkJCWVkaXRUb29sKChJQ29tbWFuZClzZWxlY3Rpb25bMF0uZ2V0RGF0YSgpKTsKKwkJCQl1cGRhdGVDb21tYW5kSXRlbShzZWxlY3Rpb25bMF0sKElDb21tYW5kKXNlbGVjdGlvblswXS5nZXREYXRhKCkpOworCQkJfQorCQl9IGVsc2UgaWYgKGJ1dHRvbiA9PSByZW1vdmVCdXR0b24pIHsKKwkJCVRhYmxlSXRlbVtdIHNlbGVjdGlvbiA9IGJ1aWxkZXJUYWJsZS5nZXRTZWxlY3Rpb24oKTsKKwkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7CisJCQkJCXNlbGVjdGlvbltpXS5kaXNwb3NlKCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGJ1dHRvbiA9PSB1cEJ1dHRvbikgeworCQkJbW92ZVNlbGVjdGlvblVwKCk7CisJCX0gZWxzZSBpZiAoYnV0dG9uID09IGRvd25CdXR0b24pIHsKKwkJCW1vdmVTZWxlY3Rpb25Eb3duKCk7CisJCX0KKwkJaGFuZGxlVGFibGVTZWxlY3Rpb25DaGFuZ2VkKCk7CisJCWJ1aWxkZXJUYWJsZS5zZXRGb2N1cygpOworCX0KKwkKKwkvKioKKwkgKiBIYW5kbGVzIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXhjZXB0aW9ucworCSAqLworCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKwkJSVN0YXR1cyBzdGF0dXM7CisJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgeworCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKWUpLmdldFN0YXR1cygpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFeHRlcm5hbFRvb2xzUGx1Z2luLlBMVUdJTl9JRCwgMCwgVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQnVpbGRlclByb3BlcnR5UGFnZS5zdGF0dXNNZXNzYWdlIiksIGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAorCQkJZ2V0U2hlbGwoKSwKKwkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkJ1aWxkZXJQcm9wZXJ0eVBhZ2UuZXJyb3JUaXRsZSIpLCAvLyROT04tTkxTLTEkCisJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJCdWlsZGVyUHJvcGVydHlQYWdlLmVycm9yTWVzc2FnZSIpLCAvLyROT04tTkxTLTEkCisJCQlzdGF0dXMpOworCX0KKwkKKwkvKioKKwkgKiBUaGUgdXNlciBoYXMgc2VsZWN0ZWQgYSBkaWZmZXJlbnQgYnVpbGRlciBpbiB0YWJsZS4KKwkgKiBVcGRhdGUgYnV0dG9uIGVuYWJsZW1lbnQuCisJICovCisJcHJpdmF0ZSB2b2lkIGhhbmRsZVRhYmxlU2VsZWN0aW9uQ2hhbmdlZCgpIHsKKwkJbmV3QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJCVRhYmxlSXRlbVtdIGl0ZW1zID0gYnVpbGRlclRhYmxlLmdldFNlbGVjdGlvbigpOworCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5sZW5ndGggPT0gMSkgeworCQkJVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1swXTsKKwkJCUlDb21tYW5kIGJ1aWxkQ29tbWFuZCA9IChJQ29tbWFuZClpdGVtLmdldERhdGEoKTsKKwkJCWlmIChidWlsZENvbW1hbmQuZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoRXh0ZXJuYWxUb29sc0J1aWxkZXIuSUQpKSB7CisJCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQkJCWludCBzZWxlY3Rpb24gPSBidWlsZGVyVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJCQlpbnQgbWF4ID0gYnVpbGRlclRhYmxlLmdldEl0ZW1Db3VudCgpOworCQkJCXVwQnV0dG9uLnNldEVuYWJsZWQoc2VsZWN0aW9uICE9IDApOworCQkJCWRvd25CdXR0b24uc2V0RW5hYmxlZChzZWxlY3Rpb24gPCBtYXgtMSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCS8vaW4gYWxsIG90aGVyIGNhc2VzIHdlIGNhbid0IGRvIGFueSBvZiB0aGVzZS4KKwkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQl1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJZG93bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwl9CisJCisJLyoqCisJICogTW92ZXMgYW4gZW50cnkgaW4gdGhlIGJ1aWxkZXIgdGFibGUgdG8gdGhlIGdpdmVuIGluZGV4LgorCSAqLworCXByaXZhdGUgdm9pZCBtb3ZlKFRhYmxlSXRlbSBpdGVtLCBpbnQgaW5kZXgpIHsKKwkJT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKKwkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoKTsKKwkJSW1hZ2UgaW1hZ2U9IGl0ZW0uZ2V0SW1hZ2UoKTsKKwkJaXRlbS5kaXNwb3NlKCk7CisJCVRhYmxlSXRlbSBuZXdJdGVtID0gbmV3IFRhYmxlSXRlbShidWlsZGVyVGFibGUsIFNXVC5OT05FLCBpbmRleCk7CisJCW5ld0l0ZW0uc2V0RGF0YShkYXRhKTsKKwkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOworCQluZXdJdGVtLnNldEltYWdlKGltYWdlKTsKKwl9CisJCisJLyoqCisJICogTW92ZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIGJ1aWxkIGxpc3QgZG93bi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgbW92ZVNlbGVjdGlvbkRvd24oKSB7CisJCS8vIE9ubHkgZG8gdGhpcyBvcGVyYXRpb24gb24gYSBzaW5nbGUgc2VsZWN0aW9uCisJCWlmIChidWlsZGVyVGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSA9PSAxKSB7CisJCQlpbnQgY3VycmVudEluZGV4ID0gYnVpbGRlclRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7CisJCQlpZiAoY3VycmVudEluZGV4IDwgYnVpbGRlclRhYmxlLmdldEl0ZW1Db3VudCgpIC0gMSkgeworCQkJCW1vdmUoYnVpbGRlclRhYmxlLmdldEl0ZW0oY3VycmVudEluZGV4KSwgY3VycmVudEluZGV4KzEpOworCQkJCWJ1aWxkZXJUYWJsZS5zZXRTZWxlY3Rpb24oY3VycmVudEluZGV4KzEpOworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIE1vdmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSBidWlsZCBsaXN0IHVwLgorCSAqLworCXByaXZhdGUgdm9pZCBtb3ZlU2VsZWN0aW9uVXAoKSB7CisJCWludCBjdXJyZW50SW5kZXggPSBidWlsZGVyVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJLy8gT25seSBkbyB0aGlzIG9wZXJhdGlvbiBvbiBhIHNpbmdsZSBzZWxlY3Rpb24KKwkJaWYgKGN1cnJlbnRJbmRleCA+IDAgJiYgYnVpbGRlclRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMSkgeworCQkJbW92ZShidWlsZGVyVGFibGUuZ2V0SXRlbShjdXJyZW50SW5kZXgpLCBjdXJyZW50SW5kZXgtMSk7CisJCQlidWlsZGVyVGFibGUuc2V0U2VsZWN0aW9uKGN1cnJlbnRJbmRleC0xKTsKKwkJfQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlUGFnZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCS8vZ2V0IGFsbCB0aGUgYnVpbGQgY29tbWFuZHMKKwkJaW50IG51bUNvbW1hbmRzID0gYnVpbGRlclRhYmxlLmdldEl0ZW1Db3VudCgpOworCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gbmV3IElDb21tYW5kW251bUNvbW1hbmRzXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db21tYW5kczsgaSsrKSB7CisJCQljb21tYW5kc1tpXSA9IChJQ29tbWFuZClidWlsZGVyVGFibGUuZ2V0SXRlbShpKS5nZXREYXRhKCk7CisJCX0KKwkJLy9zZXQgdGhlIGJ1aWxkIHNwZWMKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldElucHV0UHJvamVjdCgpOworCQl0cnkgeworCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOworCQkJZGVzYy5zZXRCdWlsZFNwZWMoY29tbWFuZHMpOworCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBudWxsKTsKKwkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7CisJfQorCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgdGFibGUgaXRlbSB3aXRoIHRoZSBnaXZlbiBidWlsZCBjb21tYW5kCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbW1hbmRJdGVtKFRhYmxlSXRlbSBpdGVtLCBJQ29tbWFuZCBjb21tYW5kKSB7CisJCVN0cmluZyBidWlsZGVySUQgPSBjb21tYW5kLmdldEJ1aWxkZXJOYW1lKCk7CisJCWlmIChidWlsZGVySUQuZXF1YWxzKEV4dGVybmFsVG9vbHNCdWlsZGVyLklEKSkgeworCQkJRXh0ZXJuYWxUb29sIHRvb2wgPSBFeHRlcm5hbFRvb2wuZnJvbUFyZ3VtZW50TWFwKGNvbW1hbmQuZ2V0QXJndW1lbnRzKCkpOworCQkJaWYgKHRvb2wgPT0gbnVsbCkgeworCQkJCWl0ZW0uc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJCdWlsZGVyUHJvcGVydHlQYWdlLmludmFsaWRCdWlsZFRvb2wiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpdGVtLnNldEltYWdlKGludmFsaWRCdWlsZFRvb2xJbWFnZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaXRlbS5zZXRUZXh0KHRvb2wuZ2V0TmFtZSgpKTsKKwkJCWlmIChFeHRlcm5hbFRvb2wuVE9PTF9UWVBFX0FOVC5lcXVhbHModG9vbC5nZXRUeXBlKCkpKSB7CisJCQkJaXRlbS5zZXRJbWFnZShhbnRJbWFnZSk7CisJCQl9IGVsc2UgeworCQkJCWl0ZW0uc2V0SW1hZ2UoZXh0ZXJuYWxUb29sSW1hZ2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gR2V0IHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBidWlsZGVyCisJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uKFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMsIAlSZXNvdXJjZXNQbHVnaW4uUFRfQlVJTERFUlMsIGJ1aWxkZXJJRCk7CisJCQlTdHJpbmcgYnVpbGRlck5hbWU7CisJCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpCisJCQkJYnVpbGRlck5hbWUgPSBleHRlbnNpb24uZ2V0TGFiZWwoKTsKKwkJCWVsc2UKKwkJCQlidWlsZGVyTmFtZSA9IFRvb2xNZXNzYWdlcy5mb3JtYXQoIkJ1aWxkZXJQcm9wZXJ0eVBhZ2UubWlzc2luZ0J1aWxkZXIiLCBuZXcgT2JqZWN0W10ge2J1aWxkZXJJRH0pOyAvLyROT04tTkxTLTEkCisJCQlpdGVtLnNldFRleHQoYnVpbGRlck5hbWUpOworCQkJaXRlbS5zZXRJbWFnZShidWlsZGVySW1hZ2UpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0NvbmZpZ3VyYXRpb25EaWFsb2cuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9Db25maWd1cmF0aW9uRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiOWVkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9Db25maWd1cmF0aW9uRGlhbG9nLmphdmEKQEAgLTAsMCArMSwzMjggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKKworLyoqCisgKiBEaWFsb2cgYm94IHRvIGFkZCwgcmVtb3ZlLCBhbmQgZWRpdCBleHRlcm5hbCB0b29scy4KKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25EaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgeworCS8vIE1pbmltdW0gaGVpZ2h0IGluIGNoYXJzIG9mIHRoZSBkZXRhaWxzIHRleHQgYm94LgorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVRBSUxTX0hFSUdIVCA9IDU7CisJCisJcHJpdmF0ZSBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7CisJcHJpdmF0ZSBCdXR0b24gbmV3QnV0dG9uOworCXByaXZhdGUgQnV0dG9uIGVkaXRCdXR0b247CisJcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOworCXByaXZhdGUgQnV0dG9uIHVwQnV0dG9uOworCXByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247CisJcHJpdmF0ZSBUZXh0IGRldGFpbFRleHQ7CisJcHJpdmF0ZSBFeHRlcm5hbFRvb2wgY3VycmVudFNlbGVjdGlvbjsKKwlwcml2YXRlIEFycmF5TGlzdCB0b29sczsKKworCS8qKgorCSAqIEluc3RhbnRpYXRlIGEgbmV3IGV4dGVybmFsIHRvb2wgY29uZmlndXJhdGlvbiBkaWFsb2cuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCBTV1Qgc2hlbGwKKwkgKi8KKwlwdWJsaWMgQ29uZmlndXJhdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgeworCQlzdXBlcihwYXJlbnRTaGVsbCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworCQlzaGVsbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25EaWFsb2cuc2hlbGxUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCisJCQlzaGVsbCwKKwkJCUlIZWxwQ29udGV4dElkcy5DT05GSUdVUkVfRElBTE9HKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7CisJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQl0b29scyA9IG5ldyBBcnJheUxpc3QoRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVnaXN0cnkoKS5nZXRFeHRlcm5hbFRvb2xzKCkpOworCQkKKwkJQ29tcG9zaXRlIGRpYWxvZ0NvbXAgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKwkJCQkKKwkJLy8gU2V0IHRpdGxlIGFuZCBtZXNzYWdlIG5vdyB0aGF0IHRoZSBjb250cm9scyBleGlzdAorCQlzZXRUaXRsZShUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uRGlhbG9nLmRpYWxvZ1RpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCXNldE1lc3NhZ2UoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQ29uZmlndXJhdGlvbkRpYWxvZy5kaWFsb2dNZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCisJCXNldFRpdGxlSW1hZ2UoRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEV4dGVybmFsVG9vbHNQbHVnaW4uSU1HX1dJWkJBTl9FWFRFUk5BTF9UT09MUykuY3JlYXRlSW1hZ2UoKSk7CisJCQkKKwkJLy8gQnVpbGQgdGhlIHRvcCBjb250YWluZXIKKwkJQ29tcG9zaXRlIHRvcENvbXAgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0NvbXAsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKKwkJdG9wQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQl0b3BDb21wLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJLy8gQnVpbGQgbWlkZGxlIGNvbnRhaW5lciB3aXRoIDIgY29sdW1ucworCQlDb21wb3NpdGUgbWlkQ29tcCA9IG5ldyBDb21wb3NpdGUodG9wQ29tcCwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQltaWRDb21wLnNldExheW91dChsYXlvdXQpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCW1pZENvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKKworCQkvLyBCdWlsZCB0aGUgdG9vbHMgbGlzdAorCQlDb21wb3NpdGUgbGlzdENvbXAgPSBuZXcgQ29tcG9zaXRlKG1pZENvbXAsIFNXVC5OT05FKTsKKwkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxpc3RDb21wLnNldExheW91dChsYXlvdXQpOworCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWxpc3RDb21wLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobGlzdENvbXAsIFNXVC5MRUZUKTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCWxhYmVsLnNldFRleHQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQ29uZmlndXJhdGlvbkRpYWxvZy50b29sTGlzdCIpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGxpc3RDb21wLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7CisJCWxpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVG9vbENvbnRlbnRQcm92aWRlcigpKTsKKwkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUb29sTGFiZWxQcm92aWRlcigpKTsKKwkJbGlzdFZpZXdlci5zZXRJbnB1dCh0b29scyk7CisJCWxpc3RWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7CisJCQkJb3BlbkVkaXRUb29sRGlhbG9nKCk7CisJCQl9CisJCX0pOworCisJCS8vIEJ1aWxkIHRoZSBidXR0b24gbGlzdAorCQlDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUobWlkQ29tcCwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKKwkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCWxhYmVsID0gbmV3IExhYmVsKGJ1dHRvbkNvbXAsIFNXVC5MRUZUKTsgLy8gc3BhY2VyCisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOworCQluZXdCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXAsICJDb25maWd1cmF0aW9uRGlhbG9nLm5ld0J1dHRvbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCWVkaXRCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXAsICJDb25maWd1cmF0aW9uRGlhbG9nLmVkaXRCdXR0b24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJcmVtb3ZlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25Db21wLCAiQ29uZmlndXJhdGlvbkRpYWxvZy5yZW1vdmVCdXR0b24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJbGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uQ29tcCwgU1dULkxFRlQpOyAvLyBzcGFjZXIKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7CisJCXVwQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25Db21wLCAiQ29uZmlndXJhdGlvbkRpYWxvZy51cEJ1dHRvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQlkb3duQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25Db21wLCAiQ29uZmlndXJhdGlvbkRpYWxvZy5kb3duQnV0dG9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCQorCQkvLyBCdWlsZCB0aGUgZGV0YWlscyBmaWVsZAorCQlsYWJlbCA9IG5ldyBMYWJlbCh0b3BDb21wLCBTV1QuTEVGVCk7CisJCWxhYmVsLnNldFRleHQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiQ29uZmlndXJhdGlvbkRpYWxvZy5kZXRhaWxzIikpOyAvLyROT04tTkxTLTEkCisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCisJCWRldGFpbFRleHQgPSBuZXcgVGV4dCh0b3BDb21wLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOworCQlkZXRhaWxUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoREVUQUlMU19IRUlHSFQpOworCQlkZXRhaWxUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOworCQkKKwkJLy8gQnVpbGQgdGhlIHNlcGFyYXRvciBsaW5lCisJCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbCh0b3BDb21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOworCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQorCQkvLyBGaW5pc2ggc2V0dXAKKwkJaG9va0J1dHRvbkFjdGlvbnMoKTsKKwkJaG9va1N0YXRlVXBkYXRlcygpOworCQkKKwkJcmV0dXJuIGRpYWxvZ0NvbXA7CisJfQorCQorCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsS2V5LCBib29sZWFuIGVuYWJsZWQpIHsKKwkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7CisJCWJ1dHRvbi5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcobGFiZWxLZXkpKTsKKwkJYnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisJCQorCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9IRUlHSFQpOworCQlpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOworCQlkYXRhLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueCk7CisJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJcmV0dXJuIGJ1dHRvbjsKKwl9CisJCisJLyoqCisJICogQWRkcyB0aGUgbGlzdGVuZXJzIHJlcXVpcmVkIHRvIGhhbmRsZSB0aGUgYnV0dG9uCisJICogYWN0aW9ucworCSAqLworCXByaXZhdGUgdm9pZCBob29rQnV0dG9uQWN0aW9ucygpIHsKKwkJbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUVkaXREaWFsb2cgZGlhbG9nOworCQkJCWRpYWxvZyA9IG5ldyBFZGl0RGlhbG9nKGdldFNoZWxsKCksIG51bGwpOworCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgeworCQkJCQlFeHRlcm5hbFRvb2wgdG9vbCA9IGRpYWxvZy5nZXRFeHRlcm5hbFRvb2woKTsKKwkJCQkJdG9vbHMuYWRkKHRvb2wpOworCQkJCQlsaXN0Vmlld2VyLmFkZCh0b29sKTsKKwkJCQkJbGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odG9vbCksIHRydWUpOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlvcGVuRWRpdFRvb2xEaWFsb2coKTsKKwkJCX0KKwkJfSk7CisKKwkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXRvb2xzLnJlbW92ZShjdXJyZW50U2VsZWN0aW9uKTsKKwkJCQlsaXN0Vmlld2VyLnJlbW92ZShjdXJyZW50U2VsZWN0aW9uKTsKKwkJCX0KKwkJfSk7CisKKwkJdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaW50IGluZGV4ID0gdG9vbHMuaW5kZXhPZihjdXJyZW50U2VsZWN0aW9uKTsKKwkJCQlpZiAoaW5kZXggPCAxKQorCQkJCQlyZXR1cm47CisJCQkJT2JqZWN0IHRvb2wgPSB0b29scy5nZXQoaW5kZXggLSAxKTsKKwkJCQl0b29scy5zZXQoaW5kZXggLSAxLCBjdXJyZW50U2VsZWN0aW9uKTsKKwkJCQl0b29scy5zZXQoaW5kZXgsIHRvb2wpOworCQkJCWxpc3RWaWV3ZXIucmVmcmVzaChmYWxzZSk7CisJCQkJdXBkYXRlVXBEb3duQnV0dG9ucygpOworCQkJfQorCQl9KTsKKworCQlkb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWludCBpbmRleCA9IHRvb2xzLmluZGV4T2YoY3VycmVudFNlbGVjdGlvbik7CisJCQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0b29scy5zaXplKCkgLSAxKQorCQkJCQlyZXR1cm47CisJCQkJT2JqZWN0IHRvb2wgPSB0b29scy5nZXQoaW5kZXggKyAxKTsKKwkJCQl0b29scy5zZXQoaW5kZXggKyAxLCBjdXJyZW50U2VsZWN0aW9uKTsKKwkJCQl0b29scy5zZXQoaW5kZXgsIHRvb2wpOworCQkJCWxpc3RWaWV3ZXIucmVmcmVzaChmYWxzZSk7CisJCQkJdXBkYXRlVXBEb3duQnV0dG9ucygpOworCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gY29udHJvbCBidXR0b24gZW5hYmxlbWVudCBiYXNlZCBvbgorCSAqIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgaG9va1N0YXRlVXBkYXRlcygpIHsKKwkJbGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOworCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkgOworCQkJCQljdXJyZW50U2VsZWN0aW9uID0gKEV4dGVybmFsVG9vbClzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJfQorCisJCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGN1cnJlbnRTZWxlY3Rpb24gIT0gbnVsbCk7CisJCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoY3VycmVudFNlbGVjdGlvbiAhPSBudWxsKTsKKwkJCQl1cGRhdGVVcERvd25CdXR0b25zKCk7CisJCQkJdXBkYXRlRGV0YWlscygpOworCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgdXAvZG93biBidXR0b25zCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVVwRG93bkJ1dHRvbnMoKSB7CisJCWludCBzZWxJbmRleCA9IGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbkluZGV4KCk7CisJCWludCBpdGVtQ291bnQgPSBsaXN0Vmlld2VyLmdldExpc3QoKS5nZXRJdGVtQ291bnQoKTsKKwkJdXBCdXR0b24uc2V0RW5hYmxlZChjdXJyZW50U2VsZWN0aW9uICE9IG51bGwgJiYgc2VsSW5kZXggPiAwKTsKKwkJZG93bkJ1dHRvbi5zZXRFbmFibGVkKGN1cnJlbnRTZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxJbmRleCA8IGl0ZW1Db3VudCAtIDEpOworCX0KKworCS8qKgorCSAqIE9wZW5zIHRoZSBlZGl0IGV4dGVybmFsIHRvb2wgZGlhbG9nIG9uCisJICogdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBleHRlcm5hbCB0b29sLgorCSAqLworCXByaXZhdGUgdm9pZCBvcGVuRWRpdFRvb2xEaWFsb2coKSB7CisJCWlmIChjdXJyZW50U2VsZWN0aW9uID09IG51bGwpCisJCQlyZXR1cm47CisJCUVkaXREaWFsb2cgZGlhbG9nOworCQlkaWFsb2cgPSBuZXcgRWRpdERpYWxvZyhnZXRTaGVsbCgpLCBjdXJyZW50U2VsZWN0aW9uKTsKKwkJZGlhbG9nLm9wZW4oKTsKKwkJbGlzdFZpZXdlci51cGRhdGUoY3VycmVudFNlbGVjdGlvbiwgbnVsbCk7CisJCXVwZGF0ZURldGFpbHMoKTsKKwl9CisJCisJLyoqCisJICogVXBkYXRlIHRoZSBkZXRhaWwgZmllbGQKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlRGV0YWlscygpIHsKKwkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gPT0gbnVsbCkKKwkJCWRldGFpbFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKKwkJZWxzZQorCQkJZGV0YWlsVGV4dC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5mb3JtYXQoIkNvbmZpZ3VyYXRpb25EaWFsb2cuZGV0YWlsTWVzc2FnZSIsIG5ldyBPYmplY3RbXSB7Y3VycmVudFNlbGVjdGlvbi5nZXRMb2NhdGlvbigpLCBjdXJyZW50U2VsZWN0aW9uLmdldEFyZ3VtZW50cygpLCBjdXJyZW50U2VsZWN0aW9uLmdldFdvcmtpbmdEaXJlY3RvcnkoKX0pKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisJCUV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlZ2lzdHJ5KCkuc2V0RXh0ZXJuYWxUb29scyh0b29scyk7CisJCXN1cGVyLm9rUHJlc3NlZCgpOworCX0KKworCQorCS8qKgorCSAqIEludGVybmFsIGNvbnRlbnQgcHJvdmlkZXIgb2YgZXhpc3RpbmcgdG9vbCB0b29scworCSAqLworCXByaXZhdGUgY2xhc3MgVG9vbENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCXJldHVybiB0b29scy50b0FycmF5KCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl9CisKKwkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCX0KKwl9CisJCisJLyoqCisJICogSW50ZXJuYWwgbGFiZWwgcHJvdmlkZXIgb2YgZXhpc3RpbmcgdG9vbCB0b29scworCSAqLworCXByaXZhdGUgY2xhc3MgVG9vbExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsVG9vbCkKKwkJCQlyZXR1cm4gKChFeHRlcm5hbFRvb2wpZWxlbWVudCkuZ2V0TmFtZSgpOworCQkJZWxzZQorCQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvRWRpdERpYWxvZy5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0VkaXREaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFmYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0VkaXREaWFsb2cuamF2YQpAQCAtMCwwICsxLDExMTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLio7CisKKy8qKgorICogRGlhbG9nIGJveCB0byBlbnRlciB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gZm9yIHJ1bm5pbmcKKyAqIGFuIGV4dGVybmFsIHRvb2wuCisgKi8KK3B1YmxpYyBjbGFzcyBFZGl0RGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKKwkvLyBUaGUgd2lkdGggb2YgbW9zdCB0ZXh0IGZpZWxkcyBpbiB0aGUgZGlhbG9nLgorCS8vIEZpZWxkcyB0aGF0IGhhdmUgbGFiZWxzIG9uIHRoZSBzYW1lIGxpbmUgYXJlIHNob3J0ZXIuCisJLy8gQXMgc3VjaCwgYWxsIGZpZWxkcyBlbmQgaW4gdGhlIHNhbWUgdmVydGljYWwgcG9zaXRpb24uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1dJRFRIID0gMzAwOworCS8vIFRoZSBzcGFjaW5nIHVzZWQgdG8gc2VwZXJhdGUgZ3JvdXBzIGluIHRoZSBkaWFsb2cuCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdST1VQX1NQQUNFID0gMjA7CisJLy8gVGhlIHNwYWNpbmcgdXNlZCB0byBzZXBlcmF0ZSB3aWRnZXRzIGluIGEgZ3JvdXAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lER0VUX1NQQUNFID0gNTsKKwkvLyBUaGUgc3BhY2luZyBvZiBtYXJnaW5zIGluIHRoZSBkaWFsb2cKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFSR0lOX1NQQUNFID0gNTsKKwkKKwkvLyBkaWFsb2cgc2l6aW5nIGNvbnN0YW50cworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfU0VMRUNUSU9OX1BBTkVfSEVJR0hUID0gMzAwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfU0VMRUNUSU9OX1BBTkVfV0lEVEggPSAzMDA7CQorCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5JVElBTF9TSE9XX0xPRyA9IHRydWU7CisJCisJcHJpdmF0ZSBUZXh0IG5hbWVGaWVsZDsKKwlwcml2YXRlIFRleHQgbG9jYXRpb25GaWVsZDsKKwlwcml2YXRlIFRleHQgYXJndW1lbnRzRmllbGQ7CisJcHJpdmF0ZSBUZXh0IGRpcmVjdG9yeUZpZWxkOworCXByaXZhdGUgVGV4dCByZWZyZXNoRmllbGQ7CisJcHJpdmF0ZSBCdXR0b24gbG9jYXRpb25Ccm93c2VXb3Jrc3BhY2U7CisJcHJpdmF0ZSBCdXR0b24gbG9jYXRpb25Ccm93c2VGaWxlU3lzdGVtOworCXByaXZhdGUgQnV0dG9uIGFyZ3VtZW50c0Jyb3dzZVZhcmlhYmxlOworLy8JcHJpdmF0ZSBCdXR0b24gZGlyZWN0b3J5QnJvd3NlV29ya3NwYWNlOworCXByaXZhdGUgQnV0dG9uIGRpcmVjdG9yeUJyb3dzZUJ1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiByZWZyZXNoT3B0aW9uQnV0dG9uOworCXByaXZhdGUgQnV0dG9uIHNob3dMb2c7CisJCisJcHJpdmF0ZSBib29sZWFuIGVkaXRNb2RlID0gZmFsc2U7CisJcHJpdmF0ZSBFeHRlcm5hbFRvb2wgdG9vbDsKKwlwcml2YXRlIFN0cmluZyByZWZyZXNoU2NvcGU7CisKKwlwcml2YXRlIGludCBtYXhCdXR0b25XaWR0aCA9IDA7CisJLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaGVpZ2h0IG9mIGEgYnV0dG9uIGFuZAorCS8vIHRoZSBoZWlnaHQgb2YgYSBsYWJlbC4KKwlwcml2YXRlIGludCBidXR0b25MYWJlbEhlaWdodERpZmY7CisJCisJLyoqCisJICogSW5zdGFudGlhdGUgYSBuZXcgdG9vbCB0b29sIGVkaXQgZGlhbG9nLgorCSAqCisJICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgU1dUIHNoZWxsCisJICogQHBhcmFtIHRvb2wgdGhlIHRvb2wgdG9vbCB0byBlZGl0LCA8Y29kZT5udWxsPC9jb2RlPiBpZiBuZXcKKwkgKi8KKwlwdWJsaWMgRWRpdERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRXh0ZXJuYWxUb29sIHRvb2wpIHsKKwkJc3VwZXIocGFyZW50U2hlbGwpOworCQlpZiAodG9vbCA9PSBudWxsKSB7CisJCQl0aGlzLnRvb2wgPSBuZXcgRXh0ZXJuYWxUb29sKCk7CisJCQl0aGlzLmVkaXRNb2RlID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQl0aGlzLnRvb2wgPSB0b29sOworCQkJdGhpcy5lZGl0TW9kZSA9IHRydWU7CisJCX0KKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworCQlpZiAoZWRpdE1vZGUpCisJCQlzaGVsbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cuZWRpdFNoZWxsVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJZWxzZQorCQkJc2hlbGwuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLm5ld1NoZWxsVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAorCQkJc2hlbGwsCisJCQlJSGVscENvbnRleHRJZHMuRURJVF9ESUFMT0cpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKKwkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7CisJCQorCQlpZiAoIWVkaXRNb2RlKQorCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCisJCS8vIE5vdyB0aGF0IGJvdGggdGhlIGRpYWxvZyBhcmVhIGFuZCBidXR0b25zIGhhdmUgYmVlbgorCQkvLyBjcmVhdGVkLCB1cGRhdGUgdGhlIG1lc3NhZ2UgZGVzY3JpcHRpb24uCisJCXZhbGlkYXRlRmllbGRzKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgZGlhbG9nQ29tcCA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCQkJCQorCQkvLyBTZXQgdGl0bGUgYW5kIG1lc3NhZ2Ugbm93IHRoYXQgdGhlIGNvbnRyb2xzIGV4aXN0CisJCXNldFRpdGxlKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cuZGlhbG9nVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGVkaXRNb2RlKQorCQkJc2V0TWVzc2FnZShUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLmVkaXREaWFsb2dNZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCisJCWVsc2UKKwkJCXNldE1lc3NhZ2UoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5uZXdEaWFsb2dNZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCisJCXNldFRpdGxlSW1hZ2UoRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEV4dGVybmFsVG9vbHNQbHVnaW4uSU1HX1dJWkJBTl9FWFRFUk5BTF9UT09MUykuY3JlYXRlSW1hZ2UoKSk7CisJCQorCQkvLyBCdWlsZCB0aGUgdG9wIGNvbnRhaW5lcgorCQlDb21wb3NpdGUgdG9wQ29tcCA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQ29tcCwgU1dULk5PTkUpOworCQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7CisJCXRvcENvbXAuc2V0TGF5b3V0KGxheW91dCk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSBNQVJHSU5fU1BBQ0U7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IE1BUkdJTl9TUEFDRTsKKwkJCisJCS8vIE5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgRm9ybURhdGEncyBmb3IgdGhlIGJ1dHRvbnMgdG8gc2V0CisJCS8vIHRoZSB3aWR0aCBvZiBhbGwgdGhlIGJ1dHRvbnMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGxhcmdlc3QKKwkJLy8gYnV0dG9uIHdpZHRoCisJCUZvcm1EYXRhW10gYnV0dG9uRGF0YSA9IG5ldyBGb3JtRGF0YVs1XTsKKwkJCisJCS8vIENyZWF0ZSBuYW1lIGxhYmVsCisJCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbCh0b3BDb21wLCBTV1QuTk9ORSk7CisJCW5hbWVMYWJlbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cubmFtZUxhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgTUFSR0lOX1NQQUNFKTsKKwkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJLy8gQ3JlYXRlIG5hbWUgdGV4dCBmaWVsZAorCQluYW1lRmllbGQgPSBuZXcgVGV4dCh0b3BDb21wLCBTV1QuQk9SREVSKTsKKwkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCBNQVJHSU5fU1BBQ0UsIFNXVC5SSUdIVCk7CisJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgMCwgU1dULkNFTlRFUik7CisJCWRhdGEud2lkdGggPSBGSUVMRF9XSURUSCAtIE1BUkdJTl9TUEFDRSAtIG5hbWVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKS54OworCQluYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKworCQkvLyBDcmVhdGUgbG9jYXRpb24gYnJvd3NlIHdvcmtzcGFjZSBidXR0b24KKwkJbG9jYXRpb25Ccm93c2VXb3Jrc3BhY2UgPSBuZXcgQnV0dG9uKHRvcENvbXAsIFNXVC5QVVNIKTsKKwkJbG9jYXRpb25Ccm93c2VXb3Jrc3BhY2Uuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLmJyb3dzZVdrc3BCdXR0b24xIikpOyAvLyROT04tTkxTLTEkCisJCWJ1dHRvbkRhdGFbMF0gPSBuZXcgRm9ybURhdGEoKTsKKwkJYnV0dG9uRGF0YVswXS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVGaWVsZCwgTUFSR0lOX1NQQUNFLCBTV1QuUklHSFQpOworCQlidXR0b25EYXRhWzBdLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lRmllbGQsIEdST1VQX1NQQUNFLCBTV1QuQk9UVE9NKTsKKwkJbG9jYXRpb25Ccm93c2VXb3Jrc3BhY2Uuc2V0TGF5b3V0RGF0YShidXR0b25EYXRhWzBdKTsKKwkJY2hlY2tGb3JNYXhXaWR0aChsb2NhdGlvbkJyb3dzZVdvcmtzcGFjZSk7CisJCQorCQkvLyBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gaGVpZ2h0IGJldHdlZW4gYSBsYWJlbCBhbmQgYSBidXR0b24uCisJCS8vIFRoaXMgdmFyaWFibGUgd2lsbCBiZSB1c2VkIHRvIGVuc3VyZSBlcXVhbCBzcGFjaW5nIGJldHdlZW4gZ3JvdXBzLgorCQlidXR0b25MYWJlbEhlaWdodERpZmYgPSBsb2NhdGlvbkJyb3dzZVdvcmtzcGFjZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKS55IC0gbmFtZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpLnk7CisKKwkJLy8gQ3JlYXRlIGxhYmVsIGZvciBsb2NhdGlvbiB0ZXh0IGZpZWxkLgorCQlMYWJlbCBsb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKHRvcENvbXAsIFNXVC5OT05FKTsKKwkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cubG9jYXRpb25MYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uQnJvd3NlV29ya3NwYWNlLCAwLCBTV1QuQk9UVE9NKTsKKwkJbG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCS8vIENyZWF0ZSBsb2NhdGlvbiB0ZXh0IGZpZWxkLgorCQlsb2NhdGlvbkZpZWxkID0gbmV3IFRleHQodG9wQ29tcCwgU1dULkJPUkRFUik7CisJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOworCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uQnJvd3NlV29ya3NwYWNlLCAtTUFSR0lOX1NQQUNFLCBTV1QuTEVGVCk7CisJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uQnJvd3NlV29ya3NwYWNlLCBXSURHRVRfU1BBQ0UsIFNXVC5CT1RUT00pOworCQlkYXRhLndpZHRoID0gRklFTERfV0lEVEg7CisJCWxvY2F0aW9uRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKworCQkvLyBDcmVhdGUgbG9jYXRpb24gYnJvd3NlIGZpbGUgc3lzdGVtIGJ1dHRvbi4KKwkJbG9jYXRpb25Ccm93c2VGaWxlU3lzdGVtID0gbmV3IEJ1dHRvbih0b3BDb21wLCBTV1QuUFVTSCk7CisJCWxvY2F0aW9uQnJvd3NlRmlsZVN5c3RlbS5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cuYnJvd3NlRmlsZVN5c0J1dHRvbjEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYnV0dG9uRGF0YVsxXSA9IG5ldyBGb3JtRGF0YSgpOworCQlidXR0b25EYXRhWzFdLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9jYXRpb25Ccm93c2VXb3Jrc3BhY2UsIDAsIFNXVC5MRUZUKTsKKwkJYnV0dG9uRGF0YVsxXS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9jYXRpb25Ccm93c2VXb3Jrc3BhY2UsIFdJREdFVF9TUEFDRSwgU1dULkJPVFRPTSk7CisJCWxvY2F0aW9uQnJvd3NlRmlsZVN5c3RlbS5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGFbMV0pOworCQljaGVja0Zvck1heFdpZHRoKGxvY2F0aW9uQnJvd3NlRmlsZVN5c3RlbSk7CisKKwkJLy8gQ3JlYXRlIGxhYmVsIGZvciBhcmd1bWVudHMgdGV4dCBmaWVsZC4KKwkJTGFiZWwgYXJndW1lbnRzTGFiZWwgPSBuZXcgTGFiZWwodG9wQ29tcCwgU1dULk5PTkUpOworCQlhcmd1bWVudHNMYWJlbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cuYXJndW1lbnRMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uRmllbGQsIEdST1VQX1NQQUNFK2J1dHRvbkxhYmVsSGVpZ2h0RGlmZiwgU1dULkJPVFRPTSk7CisJCWFyZ3VtZW50c0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJLy8gQ3JlYXRlIGFyZ3VtZW50cyB0ZXh0IGZpZWxkLgorCQlhcmd1bWVudHNGaWVsZCA9IG5ldyBUZXh0KHRvcENvbXAsIFNXVC5CT1JERVIpOworCQlkYXRhID0gbmV3IEZvcm1EYXRhICgpOworCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7CisJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9jYXRpb25Ccm93c2VGaWxlU3lzdGVtLCAtTUFSR0lOX1NQQUNFLCBTV1QuTEVGVCk7CisJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFyZ3VtZW50c0xhYmVsLCBXSURHRVRfU1BBQ0UsIFNXVC5CT1RUT00pOworCQlkYXRhLndpZHRoID0gRklFTERfV0lEVEg7CisJCWFyZ3VtZW50c0ZpZWxkLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJLy8gQ3JlYXRlIGFyZ3VtZW50IGJyb3dzZSB2YXJpYWJsZSBidXR0b24uCisJCWFyZ3VtZW50c0Jyb3dzZVZhcmlhYmxlID0gbmV3IEJ1dHRvbih0b3BDb21wLCBTV1QuUFVTSCk7CisJCWFyZ3VtZW50c0Jyb3dzZVZhcmlhYmxlLnNldFRleHQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5icm93c2VWYXJzQnV0dG9uIikpOyAvLyROT04tTkxTLTEkCisJCWJ1dHRvbkRhdGFbMl0gPSBuZXcgRm9ybURhdGEoKTsKKwkJYnV0dG9uRGF0YVsyXS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uQnJvd3NlRmlsZVN5c3RlbSwgMCwgU1dULkxFRlQpOworCQlidXR0b25EYXRhWzJdLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChhcmd1bWVudHNGaWVsZCwgMCwgU1dULkJPVFRPTSk7CisJCWFyZ3VtZW50c0Jyb3dzZVZhcmlhYmxlLnNldExheW91dERhdGEoYnV0dG9uRGF0YVsyXSk7CisJCWNoZWNrRm9yTWF4V2lkdGgoYXJndW1lbnRzQnJvd3NlVmFyaWFibGUpOworCisJCS8vIENyZWF0ZSBsYWJlbCBmb3IgZGlyZWN0b3J5IHRleHQgZmllbGQuCisJCUxhYmVsIGRpckxhYmVsID0gbmV3IExhYmVsKHRvcENvbXAsIFNXVC5OT05FKTsKKwkJZGlyTGFiZWwuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLmRpckxhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYXJndW1lbnRzRmllbGQsIEdST1VQX1NQQUNFK2J1dHRvbkxhYmVsSGVpZ2h0RGlmZiwgU1dULkJPVFRPTSk7CisJCWRpckxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJLy8gQ3JlYXRlIGRpcmVjdG9yeSB0ZXh0IGZpZWxkLgorCQlkaXJlY3RvcnlGaWVsZCA9IG5ldyBUZXh0KHRvcENvbXAsIFNXVC5CT1JERVIpOworCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKKwkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChhcmd1bWVudHNCcm93c2VWYXJpYWJsZSwgLU1BUkdJTl9TUEFDRSwgU1dULkxFRlQpOworCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkaXJMYWJlbCwgV0lER0VUX1NQQUNFLCBTV1QuQk9UVE9NKTsKKwkJZGF0YS53aWR0aCA9IEZJRUxEX1dJRFRIOworCQlkaXJlY3RvcnlGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCS8vIENyZWF0ZSBkaXJlY3RvcnkgYnJvd3NlIGZpbGUgc3lzdGVtIGJ1dHRvbi4KKwkJZGlyZWN0b3J5QnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbih0b3BDb21wLCBTV1QuUFVTSCk7CisJCWRpcmVjdG9yeUJyb3dzZUJ1dHRvbi5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cuZGlyZWN0b3J5QnJvd3NlQnV0dG9uIikpOyAvLyROT04tTkxTLTEkCisJCWJ1dHRvbkRhdGFbM10gPSBuZXcgRm9ybURhdGEoKTsKKwkJYnV0dG9uRGF0YVszXS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFyZ3VtZW50c0ZpZWxkLCBNQVJHSU5fU1BBQ0UsIFNXVC5SSUdIVCk7CisJCWJ1dHRvbkRhdGFbM10uYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KGRpcmVjdG9yeUZpZWxkLCAwLCBTV1QuQk9UVE9NKTsKKwkJZGlyZWN0b3J5QnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRGF0YVszXSk7CisJCWNoZWNrRm9yTWF4V2lkdGgoZGlyZWN0b3J5QnJvd3NlQnV0dG9uKTsKKwkJCisJCS8vIENyZWF0ZSByZWZyZXNoIGNoZWNrIGJveCBhbmQgbGFiZWwuCisJCUxhYmVsIHJlZnJlc2hMYWJlbCA9IG5ldyBMYWJlbCh0b3BDb21wLCBTV1QuTk9ORSk7CisJCXJlZnJlc2hMYWJlbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cucmVmcmVzaE9wdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7CisJCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLDApOworCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkaXJlY3RvcnlGaWVsZCwgR1JPVVBfU1BBQ0UrYnV0dG9uTGFiZWxIZWlnaHREaWZmLCBTV1QuQk9UVE9NKTsKKwkJcmVmcmVzaExhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQkvLyBDcmVhdGUgcmVmcmVzaCB0ZXh0IGZpZWxkLgorCQlyZWZyZXNoRmllbGQgPSBuZXcgVGV4dCh0b3BDb21wLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7CisJCXJlZnJlc2hGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7CisJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKKwkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlZnJlc2hMYWJlbCwgTUFSR0lOX1NQQUNFLCBTV1QuUklHSFQpOworCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChyZWZyZXNoTGFiZWwsIDAsIFNXVC5DRU5URVIpOworCQlkYXRhLndpZHRoID0gRklFTERfV0lEVEggLSBNQVJHSU5fU1BBQ0UgLSByZWZyZXNoTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSkueDsKKwkJcmVmcmVzaEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJLy8gQ3JlYXRlIHJlZnJlc2ggc2NvcGUuCisJCXJlZnJlc2hPcHRpb25CdXR0b24gPSBuZXcgQnV0dG9uKHRvcENvbXAsIFNXVC5QVVNIKTsKKwkJcmVmcmVzaE9wdGlvbkJ1dHRvbi5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cucmVmcmVzaE9wdGlvbkJ1dHRvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQlidXR0b25EYXRhWzRdID0gbmV3IEZvcm1EYXRhKCk7CisJCWJ1dHRvbkRhdGFbNF0ubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChkaXJlY3RvcnlCcm93c2VCdXR0b24sIDAsIFNXVC5MRUZUKTsKKwkJYnV0dG9uRGF0YVs0XS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVmcmVzaEZpZWxkLCAwLCBTV1QuVE9QKTsKKwkJcmVmcmVzaE9wdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGFbNF0pOworCQljaGVja0Zvck1heFdpZHRoKHJlZnJlc2hPcHRpb25CdXR0b24pOworCQkKKwkJLy8gQ3JlYXRlIHNob3cgbG9nIGNoZWNrYm94CisJCXNob3dMb2cgPSBuZXcgQnV0dG9uKHRvcENvbXAsIFNXVC5DSEVDSyk7CisJCXNob3dMb2cuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnNob3dMb2dMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQlzaG93TG9nLnNldFNlbGVjdGlvbihJTklUSUFMX1NIT1dfTE9HKTsKKwkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwwKTsKKwkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVmcmVzaEZpZWxkLCBHUk9VUF9TUEFDRSwgU1dULkJPVFRPTSk7CisJCXNob3dMb2cuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCS8vIGdpdmUgYWxsIHRoZSBidXR0b25zIHRoZSBzYW1lIHdpZHRoCisJCWZvciAoaW50IGk9MDsgaTxidXR0b25EYXRhLmxlbmd0aDsgaSsrKSB7CisJCQlidXR0b25EYXRhW2ldLndpZHRoID0gbWF4QnV0dG9uV2lkdGg7CQorCQl9CQorCQkKKwkJLy8gQnVpbGQgdGhlIHNlcGFyYXRvciBsaW5lCisJCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChkaWFsb2dDb21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOworCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQorCQkvLyBJbml0IGZpZWxkIHZhbHVlcworCQlpZiAoZWRpdE1vZGUpIHsKKwkJCW5hbWVGaWVsZC5zZXRUZXh0KHRvb2wuZ2V0TmFtZSgpKTsKKwkJCWxvY2F0aW9uRmllbGQuc2V0VGV4dCh0b29sLmdldExvY2F0aW9uKCkpOworCQkJYXJndW1lbnRzRmllbGQuc2V0VGV4dCh0b29sLmdldEFyZ3VtZW50cygpKTsKKwkJCWRpcmVjdG9yeUZpZWxkLnNldFRleHQodG9vbC5nZXRXb3JraW5nRGlyZWN0b3J5KCkpOworCQkJc2hvd0xvZy5zZXRTZWxlY3Rpb24odG9vbC5nZXRTaG93TG9nKCkpOworCQl9CisJCXJlZnJlc2hTY29wZSA9IHRvb2wuZ2V0UmVmcmVzaFNjb3BlKCk7CisJCXVwZGF0ZVJlZnJlc2hGaWVsZCgpOworCisJCS8vIFNldCB0aGUgcHJvcGVyIHRhYiBvcmRlcgorCQlDb250cm9sW10gdGFiTGlzdCA9IG5ldyBDb250cm9sW10geworCQkJbmFtZUZpZWxkLCAKKwkJCWxvY2F0aW9uRmllbGQsIAorCQkJbG9jYXRpb25Ccm93c2VXb3Jrc3BhY2UsCisJCQlsb2NhdGlvbkJyb3dzZUZpbGVTeXN0ZW0sCisJCQlhcmd1bWVudHNGaWVsZCwKKwkJCWFyZ3VtZW50c0Jyb3dzZVZhcmlhYmxlLAorCQkJZGlyZWN0b3J5RmllbGQsCisJCQlkaXJlY3RvcnlCcm93c2VCdXR0b24sCisJCQlyZWZyZXNoRmllbGQsCisJCQlyZWZyZXNoT3B0aW9uQnV0dG9ufTsKKwkJdG9wQ29tcC5zZXRUYWJMaXN0KHRhYkxpc3QpOworCQkKKwkJLy8gRmluaXNoIHNldHVwCisJCWhvb2tCdXR0b25BY3Rpb25zKCk7CisJCWhvb2tGaWVsZFZhbGlkYXRpb24oKTsKKwkJbmFtZUZpZWxkLnNldEZvY3VzKCk7CisKKwkJcmV0dXJuIGRpYWxvZ0NvbXA7CisJfQorCQorCS8qKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc3VwcGxpZWQgYnV0dG9uIGhhcyB0aGUgbWF4aW11bSB3aWR0aCBvZgorCSAqIGFsbCB0aGUgYnV0dG9ucyBzbyBmYXIuIElmIGl0IGlzLCBzdG9yZSB0aGUgd2lkdGggaW4KKwkgKiB0aGUgaW50ZWdlciB2YXJpYWJsZSA8Y29kZT5tYXhCdXR0b25XaWR0aDwvY29kZT4uCisJICovCisJcHJpdmF0ZSB2b2lkIGNoZWNrRm9yTWF4V2lkdGgoQnV0dG9uIGJ1dHRvbikgeworCQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7CisJCWlmIChzaXplLnggPiBtYXhCdXR0b25XaWR0aCkKKwkJCW1heEJ1dHRvbldpZHRoID0gc2l6ZS54OwkJCisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHRvb2wgdG9vbCBhcHBsaWNhYmxlIHRvIHRoaXMgZGlhbG9nLgorCSAqLworCXB1YmxpYyBFeHRlcm5hbFRvb2wgZ2V0RXh0ZXJuYWxUb29sKCkgeworCQlyZXR1cm4gdG9vbDsKKwl9CisJCisJLyoqCisJICogSG9va3MgdGhlIGFjdGlvbiBoYW5kbGVyIGZvciB3aGVuIGEgYnV0dG9uIGlzIHByZXNzZWQKKwkgKi8KKwlwcml2YXRlIHZvaWQgaG9va0J1dHRvbkFjdGlvbnMoKSB7CisJCWxvY2F0aW9uQnJvd3NlV29ya3NwYWNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCVJlc291cmNlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZzsKKwkJCQlkaWFsb2cgPSBuZXcgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2coCisJCQkJCWdldFNoZWxsKCksIAorCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLAorCQkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnNlbGVjdFRvb2wiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlkaWFsb2cub3BlbigpOworCQkJCU9iamVjdFtdIHJlc3VsdHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7CisJCQkJaWYgKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA8IDEpCisJCQkJCXJldHVybjsKKwkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKXJlc3VsdHNbMF07CisJCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQlUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKEV4dGVybmFsVG9vbC5WQVJfV09SS1NQQUNFX0xPQywgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBidWYpOworCQkJCWxvY2F0aW9uRmllbGQuc2V0VGV4dChidWYudG9TdHJpbmcoKSk7CisJCQl9CisJCX0pOworCQkKKwkJbG9jYXRpb25Ccm93c2VGaWxlU3lzdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULk5PTkUpOworCQkJCWRpYWxvZy5zZXRGaWxlTmFtZShsb2NhdGlvbkZpZWxkLmdldFRleHQoKSk7CisJCQkJU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKKwkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgeworCQkJCQlsb2NhdGlvbkZpZWxkLnNldFRleHQoZmlsZW5hbWUpOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJYXJndW1lbnRzQnJvd3NlVmFyaWFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJVmFyaWFibGVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nOworCQkJCWRpYWxvZyA9IG5ldyBWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpKTsKKwkJCQlkaWFsb2cub3BlbigpOworCQkJCU9iamVjdFtdIHJlc3VsdHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7CisJCQkJaWYgKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA8IDEpCisJCQkJCXJldHVybjsKKwkJCQlTdHJpbmcgYXJncyA9IGFyZ3VtZW50c0ZpZWxkLmdldFRleHQoKTsKKwkJCQlhcmdzID0gYXJncyArIChTdHJpbmcpcmVzdWx0c1swXTsKKwkJCQlhcmd1bWVudHNGaWVsZC5zZXRUZXh0KGFyZ3MpOworCQkJfQorCQl9KTsKKwkJCisJCWRpcmVjdG9yeUJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlEaXJlY3RvcnlTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpKTsKKwkJCQlkaWFsb2cub3BlbigpOworCQkJCU9iamVjdFtdIHJlc3VsdHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7CisJCQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gbnVsbDsKKwkJCQlpZiAocmVzdWx0cyAhPSBudWxsICYmIHJlc3VsdHMubGVuZ3RoID4gMCkKKwkJCQkJc2VsZWN0ZWREaXJlY3RvcnkgPSAoU3RyaW5nKXJlc3VsdHNbMF07CisJCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpIHsKKwkJCQkJZGlyZWN0b3J5RmllbGQuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7CisJCQkJfQorCQkJfQorCQl9KTsKKworCQlyZWZyZXNoT3B0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCVJlZnJlc2hTZWxlY3Rpb25EaWFsb2cgZGlhbG9nOworCQkJCWRpYWxvZyA9IG5ldyBSZWZyZXNoU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCkpOworCQkJCWRpYWxvZy5vcGVuKCk7CisJCQkJT2JqZWN0W10gcmVzdWx0cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKKwkJCQlpZiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMubGVuZ3RoIDwgMSkKKwkJCQkJcmV0dXJuOworCQkJCXJlZnJlc2hTY29wZSA9IChTdHJpbmcpcmVzdWx0c1swXTsKKwkJCQl1cGRhdGVSZWZyZXNoRmllbGQoKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCS8qKgorCSAqIEhvb2tzIHRoZSBuZWNlc3NhcnkgZmllbGQgdmFsaWRhdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBob29rRmllbGRWYWxpZGF0aW9uKCkgeworCQluYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJdmFsaWRhdGVGaWVsZHMoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlsb2NhdGlvbkZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCXZhbGlkYXRlRmllbGRzKCk7CisJCQl9CisJCX0pOworCQkKKwkJZGlyZWN0b3J5RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJdmFsaWRhdGVGaWVsZHMoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogVmFsaWRhdGUgdGhlIGZpZWxkcyBmb3IgYWNjZXB0YWJsZSB2YWx1ZXMKKwkgKi8KKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVGaWVsZHMoKSB7CisJCVN0cmluZyB2YWx1ZSA9IG5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOworCQlpZiAodmFsdWUubGVuZ3RoKCkgPCAxKSB7CisJCQlzZXRNZXNzYWdlKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cubm9Ub29sTmFtZSIpLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOyAvLyROT04tTkxTLTEkCisJCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXZhbHVlID0gbG9jYXRpb25GaWVsZC5nZXRUZXh0KCkudHJpbSgpOworCQlpZiAodmFsdWUubGVuZ3RoKCkgPCAxKSB7CisJCQlzZXRNZXNzYWdlKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cubm9Ub29sTG9jYXRpb24iKSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsgLy8kTk9OLU5MUy0xJAorCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOworCQkJcmV0dXJuOworCQl9CisKKwkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7CisJCQorCQkvLyBUcmFuc2xhdGUgZmllbGQgY29udGVudHMgdG8gdGhlIGFjdHVhbCBmaWxlIGxvY2F0aW9uIHNvIHdlCisJCS8vIGNhbiBjaGVjayB0byBlbnN1cmUgdGhlIGZpbGUgYWN0dWFsbHkgZXhpc3RzLgorCQl2YWx1ZSA9IFRvb2xVdGlsLmdldExvY2F0aW9uRnJvbVRleHQodmFsdWUpOworCQkKKwkJaWYgKHZhbHVlID09IG51bGwpIHsgLy8gVGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC4KKwkJCXNldE1lc3NhZ2UoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5taXNzaW5nVG9vbExvY2F0aW9uIiksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsJCQkKKwkJfQorCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh2YWx1ZSk7CisJCWlmICghZmlsZS5leGlzdHMoKSkgeyAvLyBUaGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KKwkJCXNldE1lc3NhZ2UoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5taXNzaW5nVG9vbExvY2F0aW9uIiksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgZmlsZU5hbWUgPSB2YWx1ZTsKKwkJCisJCXZhbHVlID0gZGlyZWN0b3J5RmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkgeworCQkJLy8gVHJhbnNsYXRlIGZpZWxkIGNvbnRlbnRzIHRvIHRoZSBhY3R1YWwgZGlyZWN0b3J5IGxvY2F0aW9uIHNvIHdlCisJCQkvLyBjYW4gY2hlY2sgdG8gZW5zdXJlIHRoZSBkaXJlY3RvcnkgYWN0dWFsbHkgZXhpc3RzLgorCQkJdmFsdWUgPSBUb29sVXRpbC5nZXRMb2NhdGlvbkZyb21UZXh0KHZhbHVlKTsKKwkJCQorCQkJaWYgKHZhbHVlID09IG51bGwpIHsgLy8gVGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC4KKwkJCQlzZXRNZXNzYWdlKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cubWlzc2luZ1Rvb2xEaXJlY3RvcnkiKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybjsJCQkKKwkJCX0JCQkKKwkJCWZpbGUgPSBuZXcgRmlsZSh2YWx1ZSk7CisJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsgLy8gVGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KKwkJCQlzZXRNZXNzYWdlKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cubWlzc2luZ1Rvb2xEaXJlY3RvcnkiKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIueG1sIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJc2V0TWVzc2FnZShUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLmhvd1RvU2VsZWN0QW50VGFyZ2V0cyIpLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoZWRpdE1vZGUpCisJCQlzZXRNZXNzYWdlKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cuZWRpdERpYWxvZ01lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJZWxzZQorCQkJc2V0TWVzc2FnZShUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLm5ld0RpYWxvZ01lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCisJICovCisJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQlTdHJpbmcgY29tbWFuZCA9IGxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJU3RyaW5nIHZhbHVlID0gVG9vbFV0aWwuZ2V0TG9jYXRpb25Gcm9tVGV4dChjb21tYW5kKTsKKwkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZW5kc1dpdGgoIi54bWwiKSkgLy8kTk9OLU5MUy0xJAorCQkJdG9vbC5zZXRUeXBlKEV4dGVybmFsVG9vbC5UT09MX1RZUEVfQU5UKTsKKwkJZWxzZQorCQkJdG9vbC5zZXRUeXBlKEV4dGVybmFsVG9vbC5UT09MX1RZUEVfUFJPR1JBTSk7CisJCXRvb2wuc2V0TmFtZShuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7CisJCXRvb2wuc2V0TG9jYXRpb24oY29tbWFuZCk7CisJCXRvb2wuc2V0QXJndW1lbnRzKGFyZ3VtZW50c0ZpZWxkLmdldFRleHQoKS50cmltKCkpOworCQl0b29sLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyZWN0b3J5RmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7CisJCXRvb2wuc2V0UmVmcmVzaFNjb3BlKHJlZnJlc2hTY29wZSk7CisJCXRvb2wuc2V0U2hvd0xvZyhzaG93TG9nLmdldFNlbGVjdGlvbigpKTsKKwkJCisJCXN1cGVyLm9rUHJlc3NlZCgpOworCX0KKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIHJlZnJlc2ggc2NvcGUgZmllbGQKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlUmVmcmVzaEZpZWxkKCkgeworCQlUb29sVXRpbC5WYXJpYWJsZURlZmluaXRpb24gcmVzdWx0ID0gVG9vbFV0aWwuZXh0cmFjdFZhcmlhYmxlVGFnKHJlZnJlc2hTY29wZSwgMCk7CisJCWlmIChyZXN1bHQubmFtZSA9PSBudWxsKSB7CisJCQlyZWZyZXNoU2NvcGUgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKEV4dGVybmFsVG9vbC5SRUZSRVNIX1NDT1BFX05PTkUsIG51bGwpOworCQkJcmVzdWx0Lm5hbWUgPSBFeHRlcm5hbFRvb2wuUkVGUkVTSF9TQ09QRV9OT05FOworCQl9CisJCQorCQlpZiAoRXh0ZXJuYWxUb29sLlJFRlJFU0hfU0NPUEVfTk9ORS5lcXVhbHMocmVzdWx0Lm5hbWUpKSB7CisJCQlyZWZyZXNoRmllbGQuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnJlZnJlc2hTY29wZU5vbmUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoRXh0ZXJuYWxUb29sLlJFRlJFU0hfU0NPUEVfV09SS1NQQUNFLmVxdWFscyhyZXN1bHQubmFtZSkpIHsKKwkJCXJlZnJlc2hGaWVsZC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cucmVmcmVzaFNjb3BlV29ya3NwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKwkJaWYgKEV4dGVybmFsVG9vbC5SRUZSRVNIX1NDT1BFX1BST0pFQ1QuZXF1YWxzKHJlc3VsdC5uYW1lKSkgeworCQkJaWYgKHJlc3VsdC5hcmd1bWVudCA9PSBudWxsKQorCQkJCXJlZnJlc2hGaWVsZC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cucmVmcmVzaFNjb3BlUHJvamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJZWxzZQorCQkJCXJlZnJlc2hGaWVsZC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5mb3JtYXQoIkVkaXREaWFsb2cucmVmcmVzaFNjb3BlUHJvamVjdFgiLCBuZXcgT2JqZWN0W10ge3Jlc3VsdC5hcmd1bWVudH0pKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisJCWlmIChFeHRlcm5hbFRvb2wuUkVGUkVTSF9TQ09QRV9XT1JLSU5HX1NFVC5lcXVhbHMocmVzdWx0Lm5hbWUpKSB7CisJCQlpZiAocmVzdWx0LmFyZ3VtZW50ID09IG51bGwpIHsKKwkJCQlyZWZyZXNoU2NvcGUgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKEV4dGVybmFsVG9vbC5SRUZSRVNIX1NDT1BFX05PTkUsIG51bGwpOworCQkJCXJlZnJlc2hGaWVsZC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cucmVmcmVzaFNjb3BlTm9uZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJZWxzZQorCQkJCXJlZnJlc2hGaWVsZC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5mb3JtYXQoIkVkaXREaWFsb2cucmVmcmVzaFNjb3BlV29ya2luZ1NldCIsIG5ldyBPYmplY3RbXSB7cmVzdWx0LmFyZ3VtZW50fSkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKwl9CisJCisJLyoqCisJICogSW50ZXJuYWwgZGlhbG9nIHRvIHNob3cgYXZhaWxhYmxlIHJlc291cmNlcyBmcm9tIHdoaWNoCisJICogdGhlIHVzZXIgY2FuIHNlbGVjdCBvbmUKKwkgKi8KKwlwcml2YXRlIGNsYXNzIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIHsKKwkJU3RyaW5nIGxhYmVsVGV4dDsKKwkJSUNvbnRhaW5lciByb290OworCQlUcmVlVmlld2VyIHdzVHJlZTsKKwkJCisJCXB1YmxpYyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIElDb250YWluZXIgcm9vdCwgU3RyaW5nIGxhYmVsVGV4dCkgeworCQkJc3VwZXIocGFyZW50KTsKKwkJCXRoaXMucm9vdCA9IHJvb3Q7CisJCQl0aGlzLmxhYmVsVGV4dCA9IGxhYmVsVGV4dDsKKwkJCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7CisJCQlzZXRUaXRsZShUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLmJyb3dzZVdvcmtzcGFjZVRpdGxlIikpOyAvLyROT04tTkxTLTEkCisJCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuUkVTT1VSQ0VfU0VMRUNUSU9OX0RJQUxPRyk7CisJCX0KKworCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCisJCSAqLworCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCS8vIGNyZWF0ZSBjb21wb3NpdGUgCisJCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCQkJCisJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTEVGVCk7CisJCQlsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7CisJCQkKKwkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGRpYWxvZ0FyZWEsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKKwkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJCWRhdGEuaGVpZ2h0SGludCA9IFNJWklOR19TRUxFQ1RJT05fUEFORV9IRUlHSFQ7CisJCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19TRUxFQ1RJT05fUEFORV9XSURUSDsKKwkJCXRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCXdzVHJlZSA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOworCQkJd3NUcmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOworCQkJd3NUcmVlLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7CisJCQl3c1RyZWUuc2V0SW5wdXQocm9vdCk7CisJCQkKKwkJCXJldHVybiBkaWFsb2dBcmVhOworCQl9CisJCQorCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCisJCSAqLworCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pd3NUcmVlLmdldFNlbGVjdGlvbigpOworCQkJaWYgKHNlbCAhPSBudWxsKQorCQkJCXNldFNlbGVjdGlvblJlc3VsdChzZWwudG9BcnJheSgpKTsKKwkJCXN1cGVyLm9rUHJlc3NlZCgpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBJbnRlcm5hbCBkaWFsb2cgdG8gc2hvdyBhdmFpbGFibGUgdmFyaWFibGVzIGZyb20gd2hpY2gKKwkgKiB0aGUgdXNlciBjYW4gc2VsZWN0IG9uZS4KKwkgKi8KKwlwcml2YXRlIGNsYXNzIFZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIHsKKwkJU3RyaW5nIGxvY2F0aW9uOworCQlMaXN0IGxpc3Q7CisJCQorCQlwdWJsaWMgVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50KSB7CisJCQlzdXBlcihwYXJlbnQpOworCQkJc2V0VGl0bGUoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5icm93c2VWYXJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLlZBUklBQkxFX1NFTEVDVElPTl9ESUFMT0cpOworCQl9CisKKwkJLyogKG5vbi1KYXZhZG9jKQorCQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCQkgKi8KKwkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCQkvLyBjcmVhdGUgY29tcG9zaXRlIAorCQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKwkJCQorCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULkxFRlQpOworCQkJbGFiZWwuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnNlbGVjdFZhciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQlsaXN0ID0gbmV3IExpc3QoZGlhbG9nQXJlYSwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOworCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkJZGF0YS5oZWlnaHRIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX0hFSUdIVDsKKwkJCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX1dJRFRIOworCQkJbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhcldvcmtzcGFjZUxvY0xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhclByb2plY3RMb2NMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJDb250YWluZXJMb2NMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJSZXNvdXJjZUxvY0xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhclByb2plY3RQYXRoTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWxpc3QuYWRkKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cudmFyQ29udGFpbmVyUGF0aExhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhclJlc291cmNlUGF0aExhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhclByb2plY3ROYW1lTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWxpc3QuYWRkKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cudmFyQ29udGFpbmVyTmFtZUxhYmVsIikpOyAvLyROT04tTkxTLTEkCQorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJSZXNvdXJjZU5hbWVMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJQcm9qZWN0WExvY0xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhckNvbnRhaW5lclhMb2NMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJSZXNvdXJjZVhMb2NMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJQcm9qZWN0WFBhdGhMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAkKKwkJCWxpc3QuYWRkKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cudmFyQ29udGFpbmVyWFBhdGhMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJSZXNvdXJjZVhQYXRoTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWxpc3QuYWRkKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cudmFyUHJvamVjdFhOYW1lTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWxpc3QuYWRkKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cudmFyQ29udGFpbmVyWE5hbWVMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJSZXNvdXJjZVhOYW1lTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQJCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhckJ1aWxkVHlwZU5hbWVMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAkKKworCQkJbG9jYXRpb24gPSBUb29sVXRpbC5nZXRMb2NhdGlvbkZyb21UZXh0KGxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7CisJCQlpZiAobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbi5lbmRzV2l0aCgiLnhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhckFudFRhcmdldExhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQl9CQkKKwkJCQorCQkJcmV0dXJuIGRpYWxvZ0FyZWE7CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KKwkJICovCisJCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKKwkJCWludCBzZWwgPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7CisJCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKwkJCQorCQkJc3dpdGNoIChzZWwpIHsKKwkJCQljYXNlIDAgOgorCQkJCQlyZXN1bHQgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKEV4dGVybmFsVG9vbC5WQVJfV09SS1NQQUNFX0xPQywgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxIDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX1BST0pFQ1RfTE9DLCBudWxsKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDIgOgorCQkJCQlyZXN1bHQgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKEV4dGVybmFsVG9vbC5WQVJfQ09OVEFJTkVSX0xPQywgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAzIDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX1JFU09VUkNFX0xPQywgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSA0IDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX1BST0pFQ1RfUEFUSCwgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSA1IDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX0NPTlRBSU5FUl9QQVRILCBudWxsKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDYgOgorCQkJCQlyZXN1bHQgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKEV4dGVybmFsVG9vbC5WQVJfUkVTT1VSQ0VfUEFUSCwgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSA3IDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX1BST0pFQ1RfTkFNRSwgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSA4IDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX0NPTlRBSU5FUl9OQU1FLCBudWxsKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDkgOgorCQkJCQlyZXN1bHQgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKEV4dGVybmFsVG9vbC5WQVJfUkVTT1VSQ0VfTkFNRSwgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxMCA6CisJCQkJCXJlc3VsdCA9IHNob3dSZXNvdXJjZURpYWxvZyhFeHRlcm5hbFRvb2wuVkFSX1BST0pFQ1RfTE9DKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDExIDoKKwkJCQkJcmVzdWx0ID0gc2hvd1Jlc291cmNlRGlhbG9nKEV4dGVybmFsVG9vbC5WQVJfQ09OVEFJTkVSX0xPQyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxMiA6CisJCQkJCXJlc3VsdCA9IHNob3dSZXNvdXJjZURpYWxvZyhFeHRlcm5hbFRvb2wuVkFSX1JFU09VUkNFX0xPQyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxMyA6CisJCQkJCXJlc3VsdCA9IHNob3dSZXNvdXJjZURpYWxvZyhFeHRlcm5hbFRvb2wuVkFSX1BST0pFQ1RfUEFUSCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxNCA6CisJCQkJCXJlc3VsdCA9IHNob3dSZXNvdXJjZURpYWxvZyhFeHRlcm5hbFRvb2wuVkFSX0NPTlRBSU5FUl9QQVRIKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDE1IDoKKwkJCQkJcmVzdWx0ID0gc2hvd1Jlc291cmNlRGlhbG9nKEV4dGVybmFsVG9vbC5WQVJfUkVTT1VSQ0VfUEFUSCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxNiA6CisJCQkJCXJlc3VsdCA9IHNob3dSZXNvdXJjZURpYWxvZyhFeHRlcm5hbFRvb2wuVkFSX1BST0pFQ1RfTkFNRSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxNyA6CisJCQkJCXJlc3VsdCA9IHNob3dSZXNvdXJjZURpYWxvZyhFeHRlcm5hbFRvb2wuVkFSX0NPTlRBSU5FUl9OQU1FKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDE4IDoKKwkJCQkJcmVzdWx0ID0gc2hvd1Jlc291cmNlRGlhbG9nKEV4dGVybmFsVG9vbC5WQVJfUkVTT1VSQ0VfTkFNRSk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIDE5IDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX0JVSUxEX1RZUEUsIG51bGwpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSAyMCA6CisJCQkJCUFudFRhcmdldExpc3QgdGFyZ2V0TGlzdCA9IG51bGw7CisJCQkJCXRyeSB7CisJCQkJCQl0YXJnZXRMaXN0ID0gQW50VXRpbC5nZXRUYXJnZXRMaXN0KG5ldyBQYXRoKGxvY2F0aW9uKSk7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAorCQkJCQkJCWdldFNoZWxsKCksCisJCQkJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5lcnJvclRpdGxlIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlUb29sTWVzc2FnZXMuZm9ybWF0KCJFZGl0RGlhbG9nLmVycm9yUmVhZEFudEZpbGUiLCBuZXcgT2JqZWN0W10ge2xvY2F0aW9ufSksIC8vJE5PTi1OTFMtMSQ7CisJCQkJCQkJZS5nZXRTdGF0dXMoKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKHRhcmdldExpc3QgPT0gbnVsbCkgeworCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoCisJCQkJCQkJZ2V0U2hlbGwoKSwKKwkJCQkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLmVycm9yVGl0bGUiKSwgLy8kTk9OLU5MUy0xJDsKKwkJCQkJCQlUb29sTWVzc2FnZXMuZm9ybWF0KCJFZGl0RGlhbG9nLm5vQW50VGFyZ2V0cyIsIG5ldyBPYmplY3RbXSB7bG9jYXRpb259KSk7IC8vJE5PTi1OTFMtMSQ7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCVRhcmdldFNlbGVjdGlvbkRpYWxvZyB0YXJnZXREaWFsb2c7CisJCQkJCXRhcmdldERpYWxvZyA9IG5ldyBUYXJnZXRTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgdGFyZ2V0TGlzdCk7CisJCQkJCXRhcmdldERpYWxvZy5vcGVuKCk7CisJCQkJCU9iamVjdFtdIHRhcmdldHMgPSB0YXJnZXREaWFsb2cuZ2V0UmVzdWx0KCk7CisJCQkJCWlmICh0YXJnZXRzICE9IG51bGwgJiYgdGFyZ2V0cy5sZW5ndGggPiAwKSB7CisJCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQkJVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZ3MoRXh0ZXJuYWxUb29sLlZBUl9BTlRfVEFSR0VULCAoU3RyaW5nW10pdGFyZ2V0cywgYnVmKTsKKwkJCQkJCXJlc3VsdCA9IGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKHJlc3VsdCAhPSBudWxsKQorCQkJCXNldFNlbGVjdGlvblJlc3VsdChuZXcgT2JqZWN0W10ge3Jlc3VsdH0pOworCQkJc3VwZXIub2tQcmVzc2VkKCk7CisJCX0KKwkJCisJCXByaXZhdGUgU3RyaW5nIHNob3dSZXNvdXJjZURpYWxvZyhTdHJpbmcgdmFyTmFtZSkgeworCQkJUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgcmVzRGlhbG9nOworCQkJcmVzRGlhbG9nID0gbmV3IFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKAorCQkJCWdldFNoZWxsKCksIAorCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksCisJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5zZWxlY3RSZXNvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmVzRGlhbG9nLm9wZW4oKTsKKwkJCU9iamVjdFtdIHJlc291cmNlID0gcmVzRGlhbG9nLmdldFJlc3VsdCgpOworCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UubGVuZ3RoID4gMCkKKwkJCQlyZXR1cm4gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyh2YXJOYW1lLCAoKElSZXNvdXJjZSlyZXNvdXJjZVswXSkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwkJLyoqCisJICogSW50ZXJuYWwgZGlhbG9nIHRvIHNob3cgYXZhaWxhYmxlIHZhcmlhYmxlcyBmcm9tIHdoaWNoCisJICogdGhlIHVzZXIgY2FuIHNlbGVjdCBvbmUuCisJICovCisJcHJpdmF0ZSBjbGFzcyBEaXJlY3RvcnlTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25EaWFsb2cgeworCQlTdHJpbmcgbG9jYXRpb247CisJCUxpc3QgbGlzdDsKKwkJCisJCXB1YmxpYyBEaXJlY3RvcnlTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50KSB7CisJCQlzdXBlcihwYXJlbnQpOworCQkJc2V0VGl0bGUoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5icm93c2VEaXJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLlZBUklBQkxFX1NFTEVDVElPTl9ESUFMT0cpOworCQl9CisKKwkJLyogKG5vbi1KYXZhZG9jKQorCQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCQkgKi8KKwkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCQkvLyBjcmVhdGUgY29tcG9zaXRlIAorCQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKwkJCQorCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULkxFRlQpOworCQkJbGFiZWwuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnNlbGVjdERpciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQlsaXN0ID0gbmV3IExpc3QoZGlhbG9nQXJlYSwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOworCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkJZGF0YS5oZWlnaHRIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX0hFSUdIVDsKKwkJCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX1dJRFRIOworCQkJbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhcldvcmtzcGFjZUxvY0xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhclByb2plY3RMb2NMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJDb250YWluZXJMb2NMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy52YXJSZXNvdXJjZUxvY0xhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLmRpckJyb3dzZVdvcmtzcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbGlzdC5hZGQoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5kaXJCcm93c2VGaWxlU3lzdGVtIikpOyAvL05PTi1OTFMtMSQpCisJCQkKKwkJCXJldHVybiBkaWFsb2dBcmVhOworCQl9CisJCQorCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCisJCSAqLworCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisJCQlpbnQgc2VsID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOworCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CisJCQkKKwkJCXN3aXRjaCAoc2VsKSB7CisJCQkJY2FzZSAwIDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX1dPUktTUEFDRV9MT0MsIG51bGwpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMSA6CisJCQkJCXJlc3VsdCA9IFRvb2xVdGlsLmJ1aWxkVmFyaWFibGVUYWcoRXh0ZXJuYWxUb29sLlZBUl9QUk9KRUNUX0xPQywgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAyIDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuVkFSX0NPTlRBSU5FUl9MT0MsIG51bGwpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMyA6CisJCQkJCXJlc3VsdCA9IFRvb2xVdGlsLmJ1aWxkVmFyaWFibGVUYWcoRXh0ZXJuYWxUb29sLlZBUl9SRVNPVVJDRV9MT0MsIG51bGwpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgNCA6CisJCQkJCXJlc3VsdCA9IHNob3dDb250YWluZXJEaWFsb2coKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDUgOgorCQkJCQlyZXN1bHQgPSBzaG93RGlyZWN0b3J5RGlhbG9nKCk7CisJCQkJCWJyZWFrOworCQkJCQorCQkJfQorCQkJCisJCQlpZiAocmVzdWx0ICE9IG51bGwpCisJCQkJc2V0U2VsZWN0aW9uUmVzdWx0KG5ldyBPYmplY3RbXSB7cmVzdWx0fSk7CisJCQlzdXBlci5va1ByZXNzZWQoKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBTdHJpbmcgc2hvd0NvbnRhaW5lckRpYWxvZygpIHsKKwkJCVN0cmluZyB2YXJOYW1lID0gRXh0ZXJuYWxUb29sLlZBUl9XT1JLU1BBQ0VfTE9DOworCQkJQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nIGNvbnRhaW5lckRpYWxvZzsKKwkJCWNvbnRhaW5lckRpYWxvZyA9IG5ldyBDb250YWluZXJTZWxlY3Rpb25EaWFsb2coCisJCQkJZ2V0U2hlbGwoKSwgCisJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwKKwkJCQlmYWxzZSwKKwkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnNlbGVjdENvbnRhaW5lciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJY29udGFpbmVyRGlhbG9nLm9wZW4oKTsKKwkJCU9iamVjdFtdIHJlc291cmNlID0gY29udGFpbmVyRGlhbG9nLmdldFJlc3VsdCgpOworCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UubGVuZ3RoID4gMCkKKwkJCQlyZXR1cm4gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyh2YXJOYW1lLCAoKElQYXRoKXJlc291cmNlWzBdKS50b1N0cmluZygpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBTdHJpbmcgc2hvd0RpcmVjdG9yeURpYWxvZygpIHsKKwkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuU0FWRSk7CisJCQkJZGlhbG9nLnNldE1lc3NhZ2UoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5zZWxlY3REaXJlY3RvcnkiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXJlY3RvcnlGaWVsZC5nZXRUZXh0KCkpOworCQkJCXJldHVybiBkaWFsb2cub3BlbigpOwkKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBJbnRlcm5hbCBkaWFsb2cgdG8gc2hvdyBhdmFpbGFibGUgcmVmcmVzaCBzY29wZSBmcm9tIHdoaWNoCisJICogdGhlIHVzZXIgY2FuIHNlbGVjdCBvbmUuCisJICovCisJcHJpdmF0ZSBjbGFzcyBSZWZyZXNoU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIHsKKwkJTGlzdCBsaXN0OworCQkKKwkJcHVibGljIFJlZnJlc2hTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50KSB7CisJCQlzdXBlcihwYXJlbnQpOworCQkJc2V0VGl0bGUoVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRWRpdERpYWxvZy5icm93c2VSZWZyZXNoVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5SRUZSRVNIX1NFTEVDVElPTl9ESUFMT0cpOworCisJCX0KKworCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCisJCSAqLworCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCS8vIGNyZWF0ZSBjb21wb3NpdGUgCisJCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCQkJCisJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTEVGVCk7CisJCQlsYWJlbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cuc2VsZWN0UmVmcmVzaCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQlsaXN0ID0gbmV3IExpc3QoZGlhbG9nQXJlYSwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOworCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkJZGF0YS5oZWlnaHRIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX0hFSUdIVDsKKwkJCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX1dJRFRIOworCQkJbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnJlZnJlc2hOb3RoaW5nTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWxpc3QuYWRkKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cucmVmcmVzaFdvcmtzcGFjZUxhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlsaXN0LmFkZChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnJlZnJlc2hQcm9qZWN0TGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWxpc3QuYWRkKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cucmVmcmVzaFByb2plY3RYTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWxpc3QuYWRkKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cucmVmcmVzaFdvcmtpbmdTZXRMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlyZXR1cm4gZGlhbG9nQXJlYTsKKwkJfQorCQkKKwkJLyogKG5vbi1KYXZhZG9jKQorCQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCQkgKi8KKwkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQkJaW50IHNlbCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJCVN0cmluZyByZXN1bHQgPSBudWxsOworCQkJCisJCQlzd2l0Y2ggKHNlbCkgeworCQkJCWNhc2UgMCA6CisJCQkJCXJlc3VsdCA9IFRvb2xVdGlsLmJ1aWxkVmFyaWFibGVUYWcoRXh0ZXJuYWxUb29sLlJFRlJFU0hfU0NPUEVfTk9ORSwgbnVsbCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIDEgOgorCQkJCQlyZXN1bHQgPSBUb29sVXRpbC5idWlsZFZhcmlhYmxlVGFnKEV4dGVybmFsVG9vbC5SRUZSRVNIX1NDT1BFX1dPUktTUEFDRSwgbnVsbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAyIDoKKwkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuUkVGUkVTSF9TQ09QRV9QUk9KRUNULCBudWxsKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDMgOgorCQkJCQlQcm9qZWN0U2VsZWN0aW9uRGlhbG9nIHByakRpYWxvZzsKKwkJCQkJcHJqRGlhbG9nID0gbmV3IFByb2plY3RTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSk7CisJCQkJCXByakRpYWxvZy5vcGVuKCk7CisJCQkJCU9iamVjdFtdIG5hbWUgPSBwcmpEaWFsb2cuZ2V0UmVzdWx0KCk7CisJCQkJCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGggPiAwKQorCQkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuUkVGUkVTSF9TQ09QRV9QUk9KRUNULCAoU3RyaW5nKW5hbWVbMF0pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgNCA6CisJCQkJCUlXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nIHNldERpYWxvZzsKKwkJCQkJc2V0RGlhbG9nID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmNyZWF0ZVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgZmFsc2UpOworCQkJCQlzZXREaWFsb2cub3BlbigpOworCQkJCQlJV29ya2luZ1NldFtdIHNldHMgPSBzZXREaWFsb2cuZ2V0U2VsZWN0aW9uKCk7CisJCQkJCWlmIChzZXRzICE9IG51bGwgJiYgc2V0cy5sZW5ndGggPiAwKQorCQkJCQkJcmVzdWx0ID0gVG9vbFV0aWwuYnVpbGRWYXJpYWJsZVRhZyhFeHRlcm5hbFRvb2wuUkVGUkVTSF9TQ09QRV9XT1JLSU5HX1NFVCwgc2V0c1swXS5nZXROYW1lKCkpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKHJlc3VsdCAhPSBudWxsKQorCQkJCXNldFNlbGVjdGlvblJlc3VsdChuZXcgT2JqZWN0W10ge3Jlc3VsdH0pOworCQkJc3VwZXIub2tQcmVzc2VkKCk7CisJCX0KKwl9CisJCisJLyoqCisJICogSW50ZXJuYWwgZGlhbG9nIHRvIHNob3cgYXZhaWxhYmxlIHByb2plY3RzIGZyb20gd2hpY2gKKwkgKiB0aGUgdXNlciBjYW4gc2VsZWN0IG9uZS4KKwkgKi8KKwlwcml2YXRlIGNsYXNzIFByb2plY3RTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25EaWFsb2cgeworCQlMaXN0IGxpc3Q7CisJCQorCQlwdWJsaWMgUHJvamVjdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKKwkJCXN1cGVyKHBhcmVudCk7CisJCQlzZXRUaXRsZShUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLmJyb3dzZVByb2plY3RUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLlBST0pFQ1RfU0VMRUNUSU9OX0RJQUxPRyk7CisJCX0KKworCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCisJCSAqLworCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCS8vIGNyZWF0ZSBjb21wb3NpdGUgCisJCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCQkJCisJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTEVGVCk7CisJCQlsYWJlbC5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkVkaXREaWFsb2cuc2VsZWN0UHJvamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQlsaXN0ID0gbmV3IExpc3QoZGlhbG9nQXJlYSwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOworCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkJZGF0YS5oZWlnaHRIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX0hFSUdIVDsKKwkJCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX1dJRFRIOworCQkJbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJCisJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJbGlzdC5hZGQocHJvamVjdHNbaV0uZ2V0TmFtZSgpKTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIGRpYWxvZ0FyZWE7CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KKwkJICovCisJCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKKwkJCXNldFNlbGVjdGlvblJlc3VsdChsaXN0LmdldFNlbGVjdGlvbigpKTsKKwkJCXN1cGVyLm9rUHJlc3NlZCgpOworCQl9CisJfQorCQorCXByaXZhdGUgY2xhc3MgVGFyZ2V0U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7CisJCXByaXZhdGUgQXJyYXlMaXN0IHNlbGVjdGVkVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGxpc3RWaWV3ZXI7CisJCXByaXZhdGUgQW50VGFyZ2V0TGlzdCB0YXJnZXRMaXN0OworCQlwcml2YXRlIEFudFRhcmdldExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBbnRUYXJnZXRMYWJlbFByb3ZpZGVyKCk7CQorCQkKKwkJcHVibGljIFRhcmdldFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIEFudFRhcmdldExpc3QgdGFyZ2V0TGlzdCkgeworCQkJc3VwZXIocGFyZW50KTsKKwkJCXRoaXMudGFyZ2V0TGlzdCA9IHRhcmdldExpc3Q7CisJCQlzZXRUaXRsZShUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnZhckFudFRhcmdldExhYmVsIikpOyAvLyROT04tTkxTLTEkCisJCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuVEFSR0VUX1NFTEVDVElPTl9ESUFMT0cpOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKKwkJCVN0cmluZyBjaGVja2VkVGFyZ2V0ID0gKFN0cmluZyllLmdldEVsZW1lbnQoKTsKKwkJCWlmIChlLmdldENoZWNrZWQoKSkKKwkJCQlzZWxlY3RlZFRhcmdldHMuYWRkKGNoZWNrZWRUYXJnZXQpOworCQkJZWxzZQorCQkJCXNlbGVjdGVkVGFyZ2V0cy5yZW1vdmUoY2hlY2tlZFRhcmdldCk7CisJCQkJCisJCQlsYWJlbFByb3ZpZGVyLnNldFNlbGVjdGVkVGFyZ2V0cyhzZWxlY3RlZFRhcmdldHMpOworCQkJbGlzdFZpZXdlci5yZWZyZXNoKCk7CisJCX0KKwkJCisJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKwkJCQorCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULkxFRlQpOworCQkJbGFiZWwuc2V0VGV4dChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJFZGl0RGlhbG9nLnNlbGVjdFRhcmdldHMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQorCQkJbGlzdFZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGRpYWxvZ0FyZWEsIFNXVC5CT1JERVIpOworCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkJZGF0YS5oZWlnaHRIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX0hFSUdIVDsKKwkJCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX1dJRFRIOworCQkJbGlzdFZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7CisJCQlsaXN0Vmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgeworCQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLE9iamVjdCBvMSxPYmplY3QgbzIpIHsKKwkJCQkJcmV0dXJuICgoU3RyaW5nKW8xKS5jb21wYXJlVG8oKFN0cmluZylvMik7CisJCQkJfQorCQkJfSk7CisJCQkKKwkJCWlmICh0YXJnZXRMaXN0ICE9IG51bGwgJiYgdGFyZ2V0TGlzdC5nZXREZWZhdWx0VGFyZ2V0KCkgIT0gbnVsbCkKKwkJCQlsYWJlbFByb3ZpZGVyLnNldERlZmF1bHRUYXJnZXROYW1lKHRhcmdldExpc3QuZ2V0RGVmYXVsdFRhcmdldCgpKTsKKwkJCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKKwkJCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBbnRUYXJnZXRDb250ZW50UHJvdmlkZXIoKSk7CisJCQlsaXN0Vmlld2VyLnNldElucHV0KHRhcmdldExpc3QpOworCQkJCisJCQlsaXN0Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKKwkJCWxpc3RWaWV3ZXIucmVmcmVzaCgpOworCQkJCisJCQlyZXR1cm4gZGlhbG9nQXJlYTsKKwkJfQorCQkKKwkJLyogKG5vbi1KYXZhZG9jKQorCQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCQkgKi8KKwkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQkJc2V0U2VsZWN0aW9uUmVzdWx0KGdldFRhcmdldE5hbWVzKCkpOworCQkJc3VwZXIub2tQcmVzc2VkKCk7CisJCX0KKwkJCisJCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUYXJnZXROYW1lcygpIHsKKwkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbc2VsZWN0ZWRUYXJnZXRzLnNpemUoKV07CisJCQlzZWxlY3RlZFRhcmdldHMudG9BcnJheShyZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9FeHRlcm5hbFRvb2xzQWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvRXh0ZXJuYWxUb29sc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTZmODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvRXh0ZXJuYWxUb29sc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS4qOworCisvKioKKyAqIFRoaXMgYWN0aW9uIHdpbGwgZGlzcGxheSB0aGUgZXh0ZXJuYWwgdG9vbCBjb25maWd1cmF0aW9uIGRpYWxvZy4KKyAqIEluIGFkZGl0aW9uLCBhcyBhIHRvb2wgYmFyIGl0ZW0sIGl0J3MgZHJvcCBkb3duIGxpc3Qgd2lsbCBpbmNsdWRlCisgKiB0b29scyB0byBydW4gZGlyZWN0bHkuCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbFRvb2xzQWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTIsIElNZW51Q3JlYXRvciB7CisJcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKKwlwcml2YXRlIElBY3Rpb24gcmVhbEFjdGlvbjsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBleHRlcm5hbCB0b29sIGNvbmZpZ3VyZSBhY3Rpb24KKwkgKi8KKwlwdWJsaWMgRXh0ZXJuYWxUb29sc0FjdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uRGVsZWdhdGUuCisJICovCisJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisJCWlmIChhY3Rpb24uaXNFbmFibGVkKCkpCisJCQlzaG93Q29uZmlndXJhdGlvbkRpYWxvZygpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbkRlbGVnYXRlLgorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmIChyZWFsQWN0aW9uID09IG51bGwpIHsKKwkJCXJlYWxBY3Rpb24gPSBhY3Rpb247CisJCQlyZWFsQWN0aW9uLnNldE1lbnVDcmVhdG9yKHRoaXMpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZS4KKwkgKi8KKwlwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7CisJCU1lbnUgbWVudT0gbmV3IE1lbnUocGFyZW50KTsKKwkJcmV0dXJuIGNyZWF0ZU1lbnUobWVudSwgZmFsc2UpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyLgorCSAqLworCXB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKKwkJTWVudSBtZW51PSBuZXcgTWVudShwYXJlbnQpOworCQlyZXR1cm4gY3JlYXRlTWVudShtZW51LCB0cnVlKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlLgorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKKwkJdGhpcy53aW5kb3cgPSB3aW5kb3c7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1lbnUgZm9yIHRoZSBhY3Rpb24KKwkgKi8KKwlwcml2YXRlIE1lbnUgY3JlYXRlTWVudShNZW51IG1lbnUsIGZpbmFsIGJvb2xlYW4gd2FudEZhc3RBY2Nlc3MpIHsKKwkJLy8gQWRkIGxpc3RlbmVyIHRvIHJlcG9wdWxhdGUgdGhlIG1lbnUgZWFjaCB0aW1lCisJCS8vIGl0IGlzIHNob3duIGJlY2F1c2Ugb2YgZHluYW1pYyBoaXN0b3J5IGxpc3QKKwkJbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7CisJCQkJTWVudSBtID0gKE1lbnUpZS53aWRnZXQ7CisJCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG0uZ2V0SXRlbXMoKTsKKwkJCQlmb3IgKGludCBpPTA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKKwkJCQkJaXRlbXNbaV0uZGlzcG9zZSgpOworCQkJCXBvcHVsYXRlTWVudShtLCB3YW50RmFzdEFjY2Vzcyk7CisJCQl9CisJCX0pOworCQkKKwkJcmV0dXJuIG1lbnU7CisJfQorCisJLyoqCisJICogUG9wdWxhdGVzIHRoZSBtZW51IHdpdGggaXRzIGl0ZW1zCisJICovCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTWVudShNZW51IG1lbnUsIGJvb2xlYW4gd2FudEZhc3RBY2Nlc3MpIHsKKwkJLy8gQWRkIGEgbWVudSBpdGVtIGZvciBlYWNoIHRvb2wgaW4gdGhlIGhpc3RvcnkKKwkJQXJyYXlMaXN0IHRvb2xzID0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVnaXN0cnkoKS5nZXRFeHRlcm5hbFRvb2xzKCk7CisJCWlmICh0b29scy5zaXplKCkgPiAwKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xzLnNpemUoKTsgaSsrKSB7CisJCQkJRXh0ZXJuYWxUb29sIHRvb2wgPSAoRXh0ZXJuYWxUb29sKXRvb2xzLmdldChpKTsKKwkJCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQkJaWYgKGkgPCA5ICYmIHdhbnRGYXN0QWNjZXNzKSB7CisJCQkJCS8vYWRkIHRoZSBudW1lcmljYWwgYWNjZWxlcmF0b3IKKwkJCQkJbGFiZWwuYXBwZW5kKCcmJyk7CisJCQkJCWxhYmVsLmFwcGVuZChpKzEpOworCQkJCQlsYWJlbC5hcHBlbmQoJyAnKTsKKwkJCQl9CisJCQkJbGFiZWwuYXBwZW5kKHRvb2wuZ2V0TmFtZSgpKTsKKwkJCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKKwkJCQlpdGVtLnNldFRleHQobGFiZWwudG9TdHJpbmcoKSk7CisJCQkJaXRlbS5zZXREYXRhKHRvb2wpOworCQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCXJ1blRvb2woKEV4dGVybmFsVG9vbCllLndpZGdldC5nZXREYXRhKCkpOworCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCQkKKwkJCS8vIEFkZCBhIHNlcGFyYXRvcgorCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOworCQl9CisKKwkJLy8gQWRkIGEgbWVudSB0byBlZGl0IHRoZSBjb25maWd1cmF0aW9ucworCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKKwkJaXRlbS5zZXRUZXh0KFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkV4dGVybmFsVG9vbHNBY3Rpb24uY29uZmlndXJlIikpOyAvLyROT04tTkxTLTEkCisJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJc2hvd0NvbmZpZ3VyYXRpb25EaWFsb2coKTsKKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogUnVucyB0aGUgc3BlY2lmaWVkIHRvb2wKKwkgKi8KKwlwcml2YXRlIHZvaWQgcnVuVG9vbChmaW5hbCBFeHRlcm5hbFRvb2wgdG9vbCkgeworCQlpZiAodG9vbCA9PSBudWxsKQorCQkJcmV0dXJuOworCQkJCisJCVRvb2xVdGlsLnNhdmVEaXJ0eUVkaXRvcnMod2luZG93KTsKKwkJCQorCQkvLyBTZWxlY3Rpb24gaXMgYXNzaWduZWQgQkVGT1JFIExvZyBDb25zb2xlIGlzIGdpdmVuIGZvY3VzLgorCQkvLyBPdGhlcndpc2UgaW5jb3JyZWN0IHNlbGVjdGlvbiBpcyB1c2VkLiBTZWxlY3Rpb24gaXMgYXNzaWduZWQgb3V0c2lkZQorCQkvLyBydW5uYWJsZS5ydW4oSVByb2dyZXNzTW9uaXRvcikgdG8gYXZvaWQgaW52YWxpZCB0aHJlYWQgYWNjZXNzLgorCQlmaW5hbCBJU2VsZWN0aW9uIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7CisJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSB3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCk7CisJCQkJCQkJCQkKKwkJaWYgKHRvb2wuZ2V0U2hvd0xvZygpKSB7CisJCQlUb29sVXRpbC5zaG93TG9nQ29uc29sZSh3aW5kb3cpOworCQkJVG9vbFV0aWwuY2xlYXJMb2dEb2N1bWVudCgpOworCQl9CisJCQorCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCisJCQkJLy8gR2V0IHRoZSBmb2N1c2VkIHJlc291cmNlLgorCQkJCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCQlPYmplY3QgcmVzdWx0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWwpLmdldEZpcnN0RWxlbWVudCgpOworCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQkJCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc3VsdDsKKwkJCQkJfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7CisJCQkJCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpKChJQWRhcHRhYmxlKSByZXN1bHQpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworCQkJCQkvLyBJZiB0aGUgYWN0aXZlIHBhcnQgaXMgYW4gZWRpdG9yLCBnZXQgdGhlIGZpbGUgcmVzb3VyY2UgdXNlZCBhcyBpbnB1dC4KKwkJCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgeworCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IChJRWRpdG9yUGFydCkgYWN0aXZlUGFydDsKKwkJCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKKwkJCQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOworCQkJCQl9IAorCQkJCX0KKworCQkJCURlZmF1bHRSdW5uZXJDb250ZXh0IGNvbnRleHQ7CisJCQkJaWYgKHJlc291cmNlICE9IG51bGwpCisJCQkJCWNvbnRleHQgPSBuZXcgRGVmYXVsdFJ1bm5lckNvbnRleHQodG9vbCwgcmVzb3VyY2UuZ2V0UHJvamVjdCgpLCByZXNvdXJjZSwgd2luZG93LmdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkpOworCQkJCWVsc2UKKwkJCQkJY29udGV4dCA9IG5ldyBEZWZhdWx0UnVubmVyQ29udGV4dCh0b29sLCBudWxsLCB3aW5kb3cuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKSk7CisJCQkJY29udGV4dC5ydW4obW9uaXRvciwgd2luZG93LmdldFNoZWxsKCkpOworCQkJfTsKKwkJfTsKKwkJCisJCXRyeSB7CisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOwkJCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybjsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7CisJCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCisJCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKWUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpLmdldFN0YXR1cygpOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRXh0ZXJuYWxUb29sc1BsdWdpbi5QTFVHSU5fSUQsIDAsIFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkV4dGVybmFsVG9vbHNBY3Rpb24uaW50ZXJuYWxFcnJvciIpLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJDsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKKwkJCQl3aW5kb3cuZ2V0U2hlbGwoKSwgCisJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRXh0ZXJuYWxUb29sc0FjdGlvbi5ydW5FcnJvclRpdGxlIiksIC8vJE5PTi1OTFMtMSQ7CisJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiRXh0ZXJuYWxUb29sc0FjdGlvbi5ydW5Qcm9ibGVtIiksIC8vJE5PTi1OTFMtMSQ7CisJCQkJc3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBTaG93cyB0aGUgdG9vbCBjb25maWd1cmF0aW9uIGRpYWxvZworCSAqLworCXByaXZhdGUgdm9pZCBzaG93Q29uZmlndXJhdGlvbkRpYWxvZygpIHsKKwkJQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2c7CisJCWRpYWxvZyA9IG5ldyBDb25maWd1cmF0aW9uRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpKTsKKwkJZGlhbG9nLm9wZW4oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvSUhlbHBDb250ZXh0SWRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxOGVkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9JSGVscENvbnRleHRJZHMuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIGV4dGVybmFsIHRvb2xzLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkCisgKiBvciBleHRlbmRlZC4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLiI7IC8vJE5PTi1OTFMtMSQKKworCS8vIEFjdGlvbnMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfQUNUSU9OID0gUFJFRklYICsgImFudF9hY3Rpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvLyBEaWFsb2dzCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJFX0RJQUxPRyA9IFBSRUZJWCArICJjb25maWd1cmVfZGlhbG9nX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9ESUFMT0cgPSBQUkVGSVggKyAiZWRpdF9kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVEFTS19ESUFMT0cgPSBQUkVGSVggKyAiYWRkX3Rhc2tfZGlhbG9nX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9TRUxFQ1RJT05fRElBTE9HID0gUFJFRklYICsgInByb2plY3Rfc2VsZWN0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfU0VMRUNUSU9OX0RJQUxPRyA9IFBSRUZJWCArICJyZWZyZXNoX3NlbGVjdGlvbl9kaWFsb2dfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0VMRUNUSU9OX0RJQUxPRyA9IFBSRUZJWCArICJ0YXJnZXRfc2VsZWN0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQkxFX1NFTEVDVElPTl9ESUFMT0cgPSBQUkVGSVggKyAidmFyaWFibGVfc2VsZWN0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1NFTEVDVElPTl9ESUFMT0cgPSBQUkVGSVggKyAicmVzb3VyY2Vfc2VsZWN0aW9uX2RpYWxvZ19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJLy8gUHJlZmVyZW5jZSBQYWdlcworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9QUkVGRVJFTkNFX1BBR0UgPSBQUkVGSVggKyAiYW50X3ByZWZlcmVuY2VfcGFnZV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19DT05TT0xFX1BSRUZFUkVOQ0VfUEFHRSA9IFBSRUZJWCArICJsb2dfY29uc29sZV9wcmVmZXJlbmNlX3BhZ2VfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvLyBWaWV3cworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19DT05TT0xFX1ZJRVcgPSBQUkVGSVggKyAibG9nX2NvbnNvbGVfdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJLy8gV2l6YXJkcworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9MQVVOQ0hfV0laQVJEID0gUFJFRklYICsgImFudF9sYXVuY2hfd2l6YXJkX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCisJCisJLy8gV2l6YXJkIFBhZ2VzCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0xBVU5DSF9XSVpBUkRfUEFHRSA9IFBSRUZJWCArICJhbnRfbGF1bmNoX3dpemFyZF9wYWdlX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvSVVJQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvSVVJQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0OTIwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9JVUlDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitUaGlzIGZpbGUgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLkV4dGVybmFsVG9vbHNQbHVnaW47CisKK3B1YmxpYyBpbnRlcmZhY2UgSVVJQ29uc3RhbnRzIHsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dTVE9SRV9MQVNURVhUSkFSPSBFeHRlcm5hbFRvb2xzUGx1Z2luLlBMVUdJTl9JRCArICIubGFzdGV4dGphciI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9Mb2dDb25zb2xlRG9jdW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9Mb2dDb25zb2xlRG9jdW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJjNDc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0xvZ0NvbnNvbGVEb2N1bWVudC5qYXZhCkBAIC0wLDAgKzEsMzI5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmUuKjsKKworLyoqCisgKiBIb2xkcyBvbnRvIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSB0aGUgZXhlY3V0aW9uIG9uIGFuCisgKiBleHRlcm5hbCB0b29sLgorICovCitwdWJsaWMgY2xhc3MgTG9nQ29uc29sZURvY3VtZW50IHsKKwkvLyBjbGFzcyB2YXJpYWJsZXMgdGhhdCBoYW5kbGUgdGhlIGNvbG9ycyBhbmQgdGhlIGZvbnQKKwlwcml2YXRlIHN0YXRpYyBDb2xvciBFUlJPUl9DT0xPUjsKKwlwcml2YXRlIHN0YXRpYyBDb2xvciBXQVJOX0NPTE9SOworCXByaXZhdGUgc3RhdGljIENvbG9yIElORk9fQ09MT1I7CisJcHJpdmF0ZSBzdGF0aWMgQ29sb3IgVkVSQk9TRV9DT0xPUjsKKwlwcml2YXRlIHN0YXRpYyBDb2xvciBERUJVR19DT0xPUjsKKwkvKnBhY2thZ2UqLyBzdGF0aWMgRm9udCBBTlRfRk9OVDsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfRVJSID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfV0FSTiA9IDEwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19JTkZPID0gMjA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1ZFUkJPU0UgPSAzMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfREVCVUcgPSA0MDsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dDb25zb2xlRG9jdW1lbnQgaW5zdGFuY2UgPSBuZXcgTG9nQ29uc29sZURvY3VtZW50KCk7CisJCisJcHJpdmF0ZSBMb2dQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyOworCisJLypwYWNrYWdlKi8gQXJyYXlMaXN0IHZpZXdzID0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQ7CisJcHJpdmF0ZSBBcnJheUxpc3Qgc3R5bGVSYW5nZXM7CisJCisJLy8gU3RydWN0dXJlIHRvIHN0b3JlIHRoZSB0ZXh0d2lkZ2V0IGluZGV4IGluZm9ybWF0aW9uCisJcHJpdmF0ZSBPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50IHJvb3QgPSBudWxsOwkKKwlwcml2YXRlIE91dHB1dFN0cnVjdHVyZUVsZW1lbnQgY3VycmVudEVsZW1lbnQgPSBudWxsOworCisJcHJpdmF0ZSBMb2dDb25zb2xlRG9jdW1lbnQoKSB7CisJCWNoYW5nZUxpc3RlbmVyID0gbmV3IExvZ1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKKwkJZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKKwkJc3R5bGVSYW5nZXMgPSBuZXcgQXJyYXlMaXN0KDUpOworCQlpbml0aWFsaXplT3V0cHV0U3RydWN0dXJlKCk7CQkKKwl9CisKKwlwdWJsaWMgdm9pZCBhcHBlbmQoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIGludCBwcmlvcml0eSkgeworCQlpZiAodmlld3Muc2l6ZSgpID09IDApCisJCQlyZXR1cm47CisJCSgoTG9nQ29uc29sZVZpZXcpdmlld3MuZ2V0KDApKS5nZXRWaWV3U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaW50IHN0YXJ0ID0gZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKKwkJCQl0cnkgeworCQkJCQkvLyBBcHBlbmQgbmV3IG1lc3NhZ2UgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuIFRoaXMKKwkJCQkJLy8gYXZvaWRzIGNvbnNvbGUgZmxpY2tlciB3aGVuIG1lc3NhZ2VzIGFyZSBhcHBlbmRlZC4KKwkJCQkJZ2V0RG9jdW1lbnQoKS5yZXBsYWNlKHN0YXJ0LCAwLCBtZXNzYWdlKTsKKwkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJCXNldE91dHB1dExldmVsQ29sb3IocHJpb3JpdHksIHN0YXJ0LCBtZXNzYWdlLmxlbmd0aCgpKTsKKwkJCX0KKwkJfSk7CQkKKwkJZm9yIChpbnQgaT0wOyBpIDwgdmlld3Muc2l6ZSgpOyBpKyspIHsKKwkJCSgoTG9nQ29uc29sZVZpZXcpdmlld3MuZ2V0KGkpKS5hcHBlbmQobWVzc2FnZSwgcHJpb3JpdHkpOwkKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkUmFuZ2VTdHlsZShpbnQgc3RhcnQsIGludCBsZW5ndGgsIENvbG9yIGNvbG9yKSB7CisJCS8vIERvbid0IGFkZCBhIFN0eWxlUmFuZ2UgaWYgdGhlIGxlbmd0aCBpcyAwLgorCQlpZiAobGVuZ3RoID09IDApCisJCQlyZXR1cm47CQorCQlpZiAoc3R5bGVSYW5nZXMuc2l6ZSgpICE9IDApIHsKKwkJCVN0eWxlUmFuZ2UgbGFzdFN0eWxlID0gKFN0eWxlUmFuZ2UpIHN0eWxlUmFuZ2VzLmdldChzdHlsZVJhbmdlcy5zaXplKCktMSk7CisJCQlpZiAoY29sb3IuZXF1YWxzKGxhc3RTdHlsZS5mb3JlZ3JvdW5kKSkKKwkJCQlsYXN0U3R5bGUubGVuZ3RoICs9IGxlbmd0aDsKKwkJCWVsc2UKKwkJCQlzdHlsZVJhbmdlcy5hZGQobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIGxlbmd0aCwgY29sb3IsIG51bGwpKTsKKwkJfSBlbHNlCisJCQlzdHlsZVJhbmdlcy5hZGQobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIGxlbmd0aCwgY29sb3IsIG51bGwpKTsKKwkJU3R5bGVSYW5nZVtdIHN0eWxlQXJyYXkgPSAoU3R5bGVSYW5nZVtdKSBzdHlsZVJhbmdlcy50b0FycmF5KG5ldyBTdHlsZVJhbmdlW3N0eWxlUmFuZ2VzLnNpemUoKV0pOwkJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHZpZXdzLnNpemUoKTsgaSsrKSB7CisJCQlUZXh0Vmlld2VyIHR2ID0gKChMb2dDb25zb2xlVmlldyl2aWV3cy5nZXQoaSkpLmdldFRleHRWaWV3ZXIoKTsKKwkJCWlmICh0diAhPSBudWxsKQorCQkJCXR2LmdldFRleHRXaWRnZXQoKS5zZXRTdHlsZVJhbmdlcyhzdHlsZUFycmF5KTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBjbGVhck91dHB1dCgpIHsKKwkJZG9jdW1lbnQuc2V0KCIiKTsKKwkJc3R5bGVSYW5nZXMuY2xlYXIoKTsKKwkJLy8gdGhlIHRyZWUgY2FuIGJlIG51bGwgaWYgI2NyZWF0ZVBhcnRDb250cm9sIGhhcyBub3QgY2FsbGVkIHlldCwgCisJCS8vIGkuZS4gaWYgdGhlIGNvbnNvbGUgZXhpc3RzIGJ1dCBoYXMgbmV2ZXIgYmVlbiBzaG93biBzbyBmYXIKKwkJaW5pdGlhbGl6ZU91dHB1dFN0cnVjdHVyZSgpOworCQlyZWZyZXNoVHJlZSgpOworCX0JCisKKwlwdWJsaWMgdm9pZCByZWZyZXNoVHJlZSgpIHsKKwkJZm9yKGludCBpPTA7IGk8dmlld3Muc2l6ZSgpOyBpKyspIHsKKwkJCSgoTG9nQ29uc29sZVZpZXcpdmlld3MuZ2V0KGkpKS5yZWZyZXNoVHJlZSgpOworCQl9CisJfQkKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb2xvciB1c2VkIGZvciBlcnJvciBtZXNzYWdlcyBvbiB0aGUgbG9nIGNvbnNvbGUuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZ2V0RXJyb3JDb2xvcigpIHsKKwkJaWYgKEVSUk9SX0NPTE9SID09IG51bGwgfHwgRVJST1JfQ09MT1IuaXNEaXNwb3NlZCgpKQorCQkJRVJST1JfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSxJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0VSUk9SX1JHQikpOworCQlyZXR1cm4gRVJST1JfQ09MT1I7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbG9yIHVzZWQgZm9yIHdhcm5pbmcgbWVzc2FnZXMgb24gdGhlIGxvZyBjb25zb2xlLgorCSAqLworCXByaXZhdGUgc3RhdGljIENvbG9yIGdldFdhcm5Db2xvcigpIHsKKwkJaWYgKFdBUk5fQ09MT1IgPT0gbnVsbCB8fCBXQVJOX0NPTE9SLmlzRGlzcG9zZWQoKSkKKwkJCVdBUk5fQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSxJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfUkdCKSk7CQorCQlyZXR1cm4gV0FSTl9DT0xPUjsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgY29sb3IgdXNlZCBmb3IgaW5mbyAobm9ybWFsKSBtZXNzYWdlcyBvbiB0aGUgbG9nIGNvbnNvbGUuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZ2V0SW5mb0NvbG9yKCkgeworCQlpZiAoSU5GT19DT0xPUiA9PSBudWxsIHx8IElORk9fQ09MT1IuaXNEaXNwb3NlZCgpKQorCQkJSU5GT19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKEV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLElQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfSU5GT19SR0IpKTsJCQorCQlyZXR1cm4gSU5GT19DT0xPUjsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgY29sb3IgdXNlZCBmb3IgdmVyYm9zZSBtZXNzYWdlcyBvbiB0aGUgbG9nIGNvbnNvbGUuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZ2V0VmVyYm9zZUNvbG9yKCkgeworCQlpZiAoVkVSQk9TRV9DT0xPUiA9PSBudWxsIHx8IFZFUkJPU0VfQ09MT1IuaXNEaXNwb3NlZCgpKQorCQkJVkVSQk9TRV9DT0xPUiA9IG5ldyBDb2xvcihudWxsLCBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKEV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLElQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfVkVSQk9TRV9SR0IpKTsJCQorCQlyZXR1cm4gVkVSQk9TRV9DT0xPUjsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgY29sb3IgdXNlZCBmb3IgZGVidWcgbWVzc2FnZXMgb24gdGhlIGxvZyBjb25zb2xlLgorCSAqLworCXByaXZhdGUgc3RhdGljIENvbG9yIGdldERlYnVnQ29sb3IoKSB7CisJCWlmIChERUJVR19DT0xPUiA9PSBudWxsIHx8IERFQlVHX0NPTE9SLmlzRGlzcG9zZWQoKSkKKwkJCURFQlVHX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9ERUJVR19SR0IpKTsJCisJCXJldHVybiBERUJVR19DT0xPUjsKKwl9CisJCisJcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKKwkJaWYgKCFoYXNWaWV3cygpKSAKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gKChMb2dDb25zb2xlVmlldyl2aWV3cy5nZXQoMCkpLmdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsJCisJfQorCQorCS8qcGFja2FnZSovIERvY3VtZW50IGdldERvY3VtZW50KCkgeworCQlyZXR1cm4gZG9jdW1lbnQ7CQorCX0KKwkKKwkvKnBhY2thZ2UqLyAgQXJyYXlMaXN0IGdldFN0eWxlUmFuZ2VzKCkgeworCQlyZXR1cm4gc3R5bGVSYW5nZXM7CQorCX0KKwkKKwlwdWJsaWMgQXJyYXlMaXN0IGdldFZpZXdzKCkgeworCQlyZXR1cm4gdmlld3M7CisJfQorCQorCS8qcGFja2FnZSovIE91dHB1dFN0cnVjdHVyZUVsZW1lbnQgZ2V0Um9vdCgpIHsKKwkJcmV0dXJuIHJvb3Q7CQorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBoYXNWaWV3cygpIHsKKwkJcmV0dXJuICh2aWV3cy5zaXplKCkgPiAwKTsJCisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPdXRwdXRTdHJ1Y3R1cmUoKSB7CisJCS8vIHJvb3QgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN0cnVjdHVyZTogaXQgaXMgYSBmYWtlIHNvIGl0IGRvZXNuJ3QgbmVlZCBhIHJlYWwgbmFtZQorCQlyb290ID0gbmV3IE91dHB1dFN0cnVjdHVyZUVsZW1lbnQoIi0tIHJvb3QgLS0iKTsgLy8gJE5PTi1OTFMtMSQKKwkJY3VycmVudEVsZW1lbnQgPSBuZXcgT3V0cHV0U3RydWN0dXJlRWxlbWVudChUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJMb2dDb25zb2xlRG9jdW1lbnQuZXh0ZXJuYWxUb29sIiksIHJvb3QsIDApOyAvLyAkTk9OLU5MUy0xJAorCQkKKwkJZm9yIChpbnQgaT0wOyBpIDwgdmlld3Muc2l6ZSgpOyBpKyspIHsKKwkJCUxvZ0NvbnNvbGVWaWV3IHZpZXcgPSAoTG9nQ29uc29sZVZpZXcpdmlld3MuZ2V0KGkpOworCQkJaWYgKHZpZXcuZ2V0VHJlZVZpZXdlcigpICE9IG51bGwpCisJCQkJdmlldy5pbml0aWFsaXplVHJlZUlucHV0KCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVnaXN0ZXJWaWV3KExvZ0NvbnNvbGVWaWV3IHZpZXcpIHsKKwkJaWYgKCFoYXNWaWV3cygpKSB7CisJCQkvLyBmaXJzdCB0aW1lIHRoZXJlIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3M6IGludGFudGlhdGUgdGhlIGZvbnQgYW5kIHJlZ2lzdGVyIHRoZSBsaXN0ZW5lcgorCQkJQU5UX0ZPTlQgPSBuZXcgRm9udChudWxsLCBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKEV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLElQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfRk9OVCkpOworCQkJRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcik7CisJCX0KKwkJdmlld3MuYWRkKHZpZXcpOwkKKwl9CisJCisJcHVibGljIHZvaWQgdW5yZWdpc3RlclZpZXcoTG9nQ29uc29sZVZpZXcgdmlldykgeworCQl2aWV3cy5yZW1vdmUodmlldyk7CQorCQlpZiAoISBoYXNWaWV3cygpKSB7CisJCQkvLyBhbGwgdGhlIGNvbnNvbGVzIGFyZSBkaXBvc2VkOiB3ZSBjYW4gZGlzcG9zZSB0aGUgZm9udCBhbmQgcmVtb3ZlIHRoZSBwcm9wZXJ0eSBsaXN0ZW5lcgorCQkJQU5UX0ZPTlQuZGlzcG9zZSgpOworCQkJRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcik7CisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBMb2dDb25zb2xlRG9jdW1lbnQgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBpbnN0YW5jZTsJCisJfQorCQorCXB1YmxpYyBPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50IGdldEN1cnJlbnRPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50KCkgeworCQlyZXR1cm4gY3VycmVudEVsZW1lbnQ7CisJfQorCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50KE91dHB1dFN0cnVjdHVyZUVsZW1lbnQgb3V0cHV0KSB7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSBvdXRwdXQ7CisJfQorCS8qcGFja2FnZSovIHZvaWQgc2V0T3V0cHV0TGV2ZWxDb2xvcihpbnQgbGV2ZWwsIGludCBzdGFydCwgaW50IGVuZCkgeworCQlzd2l0Y2ggKGxldmVsKSB7CisJCQljYXNlIExvZ0NvbnNvbGVEb2N1bWVudC5NU0dfRVJSOiAKKwkJCQlhZGRSYW5nZVN0eWxlKHN0YXJ0LCBlbmQsIGdldEVycm9yQ29sb3IoKSk7IAorCQkJCWJyZWFrOworCQkJY2FzZSBMb2dDb25zb2xlRG9jdW1lbnQuTVNHX1dBUk46IAorCQkJCWFkZFJhbmdlU3R5bGUoc3RhcnQsIGVuZCwgZ2V0V2FybkNvbG9yKCkpOyAKKwkJCQlicmVhazsKKwkJCWNhc2UgTG9nQ29uc29sZURvY3VtZW50Lk1TR19JTkZPOiAKKwkJCQlhZGRSYW5nZVN0eWxlKHN0YXJ0LCBlbmQsIGdldEluZm9Db2xvcigpKTsgCisJCQkJYnJlYWs7CisJCQljYXNlIExvZ0NvbnNvbGVEb2N1bWVudC5NU0dfVkVSQk9TRTogCisJCQkJYWRkUmFuZ2VTdHlsZShzdGFydCwgZW5kLCBnZXRWZXJib3NlQ29sb3IoKSk7IAorCQkJCWJyZWFrOworCQkJY2FzZSBMb2dDb25zb2xlRG9jdW1lbnQuTVNHX0RFQlVHOiAKKwkJCQlhZGRSYW5nZVN0eWxlKHN0YXJ0LCBlbmQsIGdldERlYnVnQ29sb3IoKSk7IAorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogCisJCQkJYWRkUmFuZ2VTdHlsZShzdGFydCwgZW5kLCBnZXRJbmZvQ29sb3IoKSk7CisJCX0KKwl9CisJCisJLyoqCisJICogUmVwbGFjZXMgdGhlIG9sZCBjb2xvciB3aXRoIHRoZSBuZXcgb25lIGluIGFsbCBzdHlsZSByYW5nZXMsCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0eWxlUmFuZ2VzKENvbG9yIG9sZENvbG9yLCBDb2xvciBuZXdDb2xvcikgeworCQlmb3IgKGludCBpPTA7IGk8c3R5bGVSYW5nZXMuc2l6ZSgpOyBpKyspIHsKKwkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSAoU3R5bGVSYW5nZSlzdHlsZVJhbmdlcy5nZXQoaSk7CisJCQlpZiAocmFuZ2UuZm9yZWdyb3VuZCA9PSBvbGRDb2xvcikKKwkJCQlyYW5nZS5mb3JlZ3JvdW5kID0gbmV3Q29sb3I7CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIExvZ1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisJCisJCS8vIHByaXZhdGUgY29uc3RydWN0b3IgdG8gZW5zdXJlIHRoZSBzaW5nbGV0b24KKwkJcHJpdmF0ZSBMb2dQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KQorCQkgKi8KKwkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWU9IGV2ZW50LmdldFByb3BlcnR5KCk7CisJCQkKKwkJCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0VSUk9SX1JHQikpIHsKKwkJCQkJaWYgKExvZ0NvbnNvbGVEb2N1bWVudC5FUlJPUl9DT0xPUiA9PSBudWxsKQorCQkJCQkJcmV0dXJuOworCQkJCQlDb2xvciB0ZW1wID0gZ2V0RXJyb3JDb2xvcigpOworCQkJCQlMb2dDb25zb2xlRG9jdW1lbnQuRVJST1JfQ09MT1IgPSBUb29sc1ByZWZlcmVuY2VQYWdlLmdldFByZWZlcmVuY2VDb2xvcihJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0VSUk9SX1JHQik7CisJCQkJCXVwZGF0ZVN0eWxlUmFuZ2VzKHRlbXAsIGdldEVycm9yQ29sb3IoKSk7CisJCQkJCXRlbXAuZGlzcG9zZSgpOworCQkJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfUkdCKSkgeworCQkJCQlpZiAoTG9nQ29uc29sZURvY3VtZW50LldBUk5fQ09MT1IgPT0gbnVsbCkKKwkJCQkJCXJldHVybjsKKwkJCQkJQ29sb3IgdGVtcCA9IGdldFdhcm5Db2xvcigpOworCQkJCQlMb2dDb25zb2xlRG9jdW1lbnQuV0FSTl9DT0xPUiA9IFRvb2xzUHJlZmVyZW5jZVBhZ2UuZ2V0UHJlZmVyZW5jZUNvbG9yKElQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfV0FSTklOR19SR0IpOworCQkJCQl1cGRhdGVTdHlsZVJhbmdlcyh0ZW1wLCBnZXRXYXJuQ29sb3IoKSk7CisJCQkJCXRlbXAuZGlzcG9zZSgpOworCQkJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0lORk9fUkdCKSkgeworCQkJCQlpZiAoTG9nQ29uc29sZURvY3VtZW50LklORk9fQ09MT1IgPT0gbnVsbCkKKwkJCQkJCXJldHVybjsKKwkJCQkJQ29sb3IgdGVtcCA9IGdldEluZm9Db2xvcigpOworCQkJCQlMb2dDb25zb2xlRG9jdW1lbnQuSU5GT19DT0xPUiA9IFRvb2xzUHJlZmVyZW5jZVBhZ2UuZ2V0UHJlZmVyZW5jZUNvbG9yKElQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfSU5GT19SR0IpOworCQkJCQl1cGRhdGVTdHlsZVJhbmdlcyh0ZW1wLCBnZXRJbmZvQ29sb3IoKSk7CisJCQkJCXRlbXAuZGlzcG9zZSgpOworCQkJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1ZFUkJPU0VfUkdCKSkgeworCQkJCQlpZiAoTG9nQ29uc29sZURvY3VtZW50LlZFUkJPU0VfQ09MT1IgPT0gbnVsbCkKKwkJCQkJCXJldHVybjsKKwkJCQkJQ29sb3IgdGVtcCA9IGdldFZlcmJvc2VDb2xvcigpOworCQkJCQlMb2dDb25zb2xlRG9jdW1lbnQuVkVSQk9TRV9DT0xPUiA9IFRvb2xzUHJlZmVyZW5jZVBhZ2UuZ2V0UHJlZmVyZW5jZUNvbG9yKElQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfVkVSQk9TRV9SR0IpOworCQkJCQl1cGRhdGVTdHlsZVJhbmdlcyh0ZW1wLCBnZXRWZXJib3NlQ29sb3IoKSk7CisJCQkJCXRlbXAuZGlzcG9zZSgpOworCQkJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0RFQlVHX1JHQikpIHsKKwkJCQkJaWYgKExvZ0NvbnNvbGVEb2N1bWVudC5ERUJVR19DT0xPUiA9PSBudWxsKQorCQkJCQkJcmV0dXJuOworCQkJCQlDb2xvciB0ZW1wID0gZ2V0RGVidWdDb2xvcigpOworCQkJCQlMb2dDb25zb2xlRG9jdW1lbnQuREVCVUdfQ09MT1IgPSBUb29sc1ByZWZlcmVuY2VQYWdlLmdldFByZWZlcmVuY2VDb2xvcihJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0RFQlVHX1JHQik7CisJCQkJCXVwZGF0ZVN0eWxlUmFuZ2VzKHRlbXAsIGdldERlYnVnQ29sb3IoKSk7CisJCQkJCXRlbXAuZGlzcG9zZSgpOworCQkJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0ZPTlQpKSB7CisJCQkJCUZvbnREYXRhIGRhdGE9IFRvb2xzUHJlZmVyZW5jZVBhZ2UuZ2V0Q29uc29sZUZvbnREYXRhKCk7CisJCQkJCUZvbnQgdGVtcD0gTG9nQ29uc29sZURvY3VtZW50LkFOVF9GT05UOworCQkJCQlMb2dDb25zb2xlRG9jdW1lbnQuQU5UX0ZPTlQgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgZGF0YSk7CisJCQkJCXRlbXAuZGlzcG9zZSgpOworCQkJCQl1cGRhdGVGb250KCk7CQorCQkJCX0gZWxzZQorCQkJCQlyZXR1cm47CisJCX0KKwkKKwkJLyoqCisJCSAqIENsZWFycyB0aGUgb3V0cHV0IG9mIGFsbCB0aGUgY29uc29sZXMKKwkJICovCisJCXByaXZhdGUgdm9pZCBjbGVhck91dHB1dCgpIHsKKwkJCUxvZ0NvbnNvbGVEb2N1bWVudC5nZXRJbnN0YW5jZSgpLmNsZWFyT3V0cHV0KCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBVcGRhdGVzIHRlaCBmb250IGluIGFsbCB0aGUgY29uc29sZXMKKwkJICovCisJCXByaXZhdGUgdm9pZCB1cGRhdGVGb250KCkgeworCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IExvZ0NvbnNvbGVEb2N1bWVudC5nZXRJbnN0YW5jZSgpLmdldFZpZXdzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKKwkJCQkgKChMb2dDb25zb2xlVmlldykgaXRlcmF0b3IubmV4dCgpKS51cGRhdGVGb250KCk7CisJCX0KKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0xvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0xvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YmY5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvTG9nQ29uc29sZVByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKKworLyoqCisgKiBBIHBhZ2UgdG8gc2V0IHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIGNvbnNvbGUKKyAqIAorICogQGRlcHJlY2F0ZWQgVGhpcyBwcmVmZXJlbmNlIHBhZ2Ugc2hvdWxkIG5vdCBiZSB1c2VkLiBUbyBiZSByZW1vdmVkIGJ5IG5leHQgcmVsZWFzZS4KKyAqLworcHVibGljIGNsYXNzIExvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZQorCWV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQorCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgY29uc29sZSBwYWdlLgorCSAqLworCXB1YmxpYyBMb2dDb25zb2xlUHJlZmVyZW5jZVBhZ2UoKSB7CisJCXN1cGVyKEdSSUQpOworCisJCXNldERlc2NyaXB0aW9uKFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkxvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZS5kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPQorCQkJRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCXNldFByZWZlcmVuY2VTdG9yZShzdG9yZSk7CisJfQorCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CisJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksIElIZWxwQ29udGV4dElkcy5MT0dfQ09OU09MRV9QUkVGRVJFTkNFX1BBR0UpOworCX0KKwkvKioKKwkgKiBDcmVhdGUgYWxsIGZpZWxkIGVkaXRvcnMgZm9yIHRoaXMgcGFnZQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKKworCQlDb2xvckZpZWxkRWRpdG9yIGVyck91dCA9CisJCQluZXcgQ29sb3JGaWVsZEVkaXRvcigKKwkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0VSUk9SX1JHQiwKKwkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJMb2dDb25zb2xlUHJlZmVyZW5jZVBhZ2UuZXJyb3JDb2xvciIpLCAvLyROT04tTkxTLTEkCisJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCUNvbG9yRmllbGRFZGl0b3Igd2Fybk91dCA9CisJCQluZXcgQ29sb3JGaWVsZEVkaXRvcigKKwkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfUkdCLAorCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkxvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZS53YXJuaW5nQ29sb3IiKSwgLy8kTk9OLU5MUy0xJAorCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCQlDb2xvckZpZWxkRWRpdG9yIGluZm9PdXQgPQorCQkJbmV3IENvbG9yRmllbGRFZGl0b3IoCisJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9JTkZPX1JHQiwKKwkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJMb2dDb25zb2xlUHJlZmVyZW5jZVBhZ2UuaW5mb0NvbG9yIiksIC8vJE5PTi1OTFMtMSQKKwkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKwkJQ29sb3JGaWVsZEVkaXRvciB2ZXJiT3V0ID0KKwkJCW5ldyBDb2xvckZpZWxkRWRpdG9yKAorCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfVkVSQk9TRV9SR0IsCisJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiTG9nQ29uc29sZVByZWZlcmVuY2VQYWdlLnZlcmJvc2VDb2xvciIpLCAvLyROT04tTkxTLTEkCisJCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7CisJCUNvbG9yRmllbGRFZGl0b3IgZGVidWdPdXQgPQorCQkJbmV3IENvbG9yRmllbGRFZGl0b3IoCisJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9ERUJVR19SR0IsCisJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiTG9nQ29uc29sZVByZWZlcmVuY2VQYWdlLmRlYnVnQ29sb3IiKSwgLy8kTk9OLU5MUy0xJAorCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOworCisJCUZvbnRGaWVsZEVkaXRvciBmb250ID0KKwkJCW5ldyBGb250RmllbGRFZGl0b3IoCisJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9GT05ULAorCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkxvZ0NvbnNvbGVQcmVmZXJlbmNlUGFnZS5mb250IiksIC8vJE5PTi1OTFMtMSQKKwkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKKworCQlhZGRGaWVsZChlcnJPdXQpOworCQlhZGRGaWVsZCh3YXJuT3V0KTsKKwkJYWRkRmllbGQoaW5mb091dCk7CisJCWFkZEZpZWxkKHZlcmJPdXQpOworCQlhZGRGaWVsZChkZWJ1Z091dCk7CisJCWFkZEZpZWxkKGZvbnQpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmb250IGRhdGEgdGhhdCBkZXNjcmliZXMgdGhlIGZvbnQgdG8gdXNlIGZvciB0aGUgY29uc29sZQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRm9udERhdGEgZ2V0Q29uc29sZUZvbnREYXRhKCkgeworCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZSA9CisJCQlFeHRlcm5hbFRvb2xzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKKwkJRm9udERhdGEgZm9udERhdGEgPQorCQkJUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YSgKKwkJCQlwc3RvcmUsCisJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9GT05UKTsKKwkJcmV0dXJuIGZvbnREYXRhOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhIGNvbG9yIGJhc2VkIG9uIHRoZSB0eXBlLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgQ29sb3IgZ2V0UHJlZmVyZW5jZUNvbG9yKFN0cmluZyB0eXBlKSB7CisJCUlQcmVmZXJlbmNlU3RvcmUgcHN0b3JlID0KKwkJCUV4dGVybmFsVG9vbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworCQlSR0Igb3V0UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihwc3RvcmUsIHR5cGUpOworCQlyZXR1cm4gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBvdXRSR0IpOworCX0KKwkvKioKKwkgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0CisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9Mb2dDb25zb2xlVmlldy5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0xvZ0NvbnNvbGVWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyNDYyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9Mb2dDb25zb2xlVmlldy5qYXZhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvRXh0ZXJuYWwgVG9vbHMvb3JnL2VjbGlwc2UvdWkvZXh0ZXJuYWx0b29scy9pbnRlcm5hbC91aS9Mb2dUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvTG9nVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2E1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvTG9nVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAoroAorQ29udHJpYnV0b3JzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCisvKioKKyAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB0cmVlIHZpZXdlciBvZiB0aGUgQW50IENvbnNvbGUuCisgKi8KKworcHVibGljIGNsYXNzIExvZ1RyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7CisKKwlwcml2YXRlIExvZ0NvbnNvbGVWaWV3IGNvbnNvbGU7CisKKwlwdWJsaWMgTG9nVHJlZUNvbnRlbnRQcm92aWRlcihMb2dDb25zb2xlVmlldyBjb25zb2xlKSB7CisJCXRoaXMuY29uc29sZSA9IGNvbnNvbGU7CisJfQorCisJLyoqCisJICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCisJICovCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKKwkJcmV0dXJuICgoT3V0cHV0U3RydWN0dXJlRWxlbWVudCkgcGFyZW50KS5nZXRDaGlsZHJlbigpOworCX0KKworCS8qKgorCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gKChPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50KSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gKChPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50KSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOworCX0KKworCS8qKgorCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7CisJCXJldHVybiAoKE91dHB1dFN0cnVjdHVyZUVsZW1lbnQpIHBhcmVudCkuZ2V0Q2hpbGRyZW4oKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCisJICovCisJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0xvZ1RyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvTG9nVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmM4NzQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL0xvZ1RyZWVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmUuVG9vbE1lc3NhZ2VzOworCisvKioKKyAqIExhYmVsIHByb3ZpZGVyIGZvciB0aGUgdHJlZSB2aWV3ZXIgb2YgdGhlIExvZyBDb25zb2xlLgorICovCitwdWJsaWMgY2xhc3MgTG9nVHJlZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CisKKwlwcml2YXRlIExvZ0NvbnNvbGVWaWV3IGNvbnNvbGU7CisKKwlwdWJsaWMgTG9nVHJlZUxhYmVsUHJvdmlkZXIoTG9nQ29uc29sZVZpZXcgY29uc29sZSkgeworCQl0aGlzLmNvbnNvbGUgPSBjb25zb2xlOworCX0KKworCS8qKgorCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQlTdHJpbmcgdGV4dCA9ICgoT3V0cHV0U3RydWN0dXJlRWxlbWVudCkgZWxlbWVudCkuZ2V0TmFtZSgpOworCQlpZiAodGV4dCA9PSBudWxsKQorCQkJLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB1c2VyIHdyaXRlcyBhIHRhc2sgbmFtZSB0aGF0IGRvZXNuJ3QgZXhpc3QgPT4gdGhlICN0YXNrU3RhcnRlZCB3aWxsIGJlIHRyaWdnZXJlZAorCQkJLy8gYnV0IG51bGwgd2lsbCBiZSBnaXZlbiBhcyBhIG5hbWUgdG8gdGhlIGN1cnJlbnQgdGFzaywgYW5kIHRoZW4gb25seSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZAorCQkJcmV0dXJuIFRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIkxvZ1RyZWVMYWJlbFByb3ZpZGVyLmludmFsaWRJdGVtTmFtZSIpOyAvLyAkTk9OLU5MUy0xJAorCQlyZXR1cm4gdGV4dDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShPYmplY3QsIFN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGFyZzAsIFN0cmluZyBhcmcxKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvT3V0cHV0U3RydWN0dXJlRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL091dHB1dFN0cnVjdHVyZUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmI1Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL091dHB1dFN0cnVjdHVyZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IAorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogT2JqZWN0IHdoaWNoIHN0b3JlcyB0aGUgaW5kZXggYW5kIHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dCBmb3IgYSBnaXZlbgorICogdGFyZ2V0IG9yIHRhc2sgKHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nKQorICovCisKK3B1YmxpYyBjbGFzcyBPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50IHsKKworCXByaXZhdGUgT3V0cHV0U3RydWN0dXJlRWxlbWVudCBwYXJlbnQgPSBudWxsOworCXByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBpbnQgc3RhcnRJbmRleCA9IDA7CisJcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKKworCisvKioKKyAqIFRoaXMgY29uc3RydWN0b3IgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGJ5IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzdHJ1Y3R1cmUgKHRoZSByb290IGVsZW1lbnQpCisgKi8KK3B1YmxpYyBPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50KFN0cmluZyBuYW1lKSB7CisJLy8gdGhlcmUncyBhdCBsZWFzdCBvbmUgdGFyZ2V0IGFzIGl0IGlzIHRoZSByb290IHdoaWNoIG1heSBiZSBpbnN0YW50aWF0ZWQgdmlhIHRoaXMgY29uc3RydWN0b3IKKwljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMSk7CisJdGhpcy5uYW1lID0gbmFtZTsKK30KKworLyoqCisgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIGFueSBlbGVtZW50IGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlICh0aGUgcm9vdCBlbGVtZW50KQorICovCQorcHVibGljIE91dHB1dFN0cnVjdHVyZUVsZW1lbnQoU3RyaW5nIG5hbWUsIE91dHB1dFN0cnVjdHVyZUVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCkgeworCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgwKTsKKwl0aGlzLm5hbWUgPSBuYW1lOworCXRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7CisJcGFyZW50LmFkZENoaWxkKHRoaXMpOworfQorCitwdWJsaWMgdm9pZCBhZGRDaGlsZChPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50IGNoaWxkKSB7CisJY2hpbGRyZW4uYWRkKGNoaWxkKTsKKwljaGlsZC5zZXRQYXJlbnQodGhpcyk7Cit9CisKK3B1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgeworCXJldHVybiAhY2hpbGRyZW4uaXNFbXB0eSgpOworfQorCitwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIG5hbWU7Cit9CisKK3B1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwl0aGlzLm5hbWUgPSBuYW1lOworfQorCitwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT3V0cHV0U3RydWN0dXJlRWxlbWVudCBwYXJlbnQpIHsKKwl0aGlzLnBhcmVudCA9IHBhcmVudDsKK30KKworcHVibGljIE91dHB1dFN0cnVjdHVyZUVsZW1lbnQgZ2V0UGFyZW50KCkgeworCXJldHVybiBwYXJlbnQ7Cit9CisKK3B1YmxpYyBPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7CisJcmV0dXJuIChPdXRwdXRTdHJ1Y3R1cmVFbGVtZW50W10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IE91dHB1dFN0cnVjdHVyZUVsZW1lbnRbY2hpbGRyZW4uc2l6ZSgpXSk7Cit9CisKK3B1YmxpYyB2b2lkIHNldFN0YXJ0SW5kZXgoaW50IGluZGV4KSB7CisJc3RhcnRJbmRleCA9IGluZGV4OworfQorCitwdWJsaWMgdm9pZCBzZXRFbmRJbmRleChpbnQgaW5kZXgpIHsKKwlsZW5ndGggPSBpbmRleCAtIHN0YXJ0SW5kZXg7Cit9CisKK3B1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpIHsKKwlyZXR1cm4gc3RhcnRJbmRleDsKK30KKworcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKKwlyZXR1cm4gc3RhcnRJbmRleCArIGxlbmd0aDsKK30KKworcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisJcmV0dXJuIGxlbmd0aDsKK30KKworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gbmFtZTsKK30KKworfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL3VpL2V4dGVybmFsdG9vbHMvaW50ZXJuYWwvdWkvVG9vbHNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL1Rvb2xzUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzFkOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL1Rvb2xzUHJlZmVyZW5jZVBhZ2UuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiNDExYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvYWJvdXQuaHRtbApAQCAtMCwwICsxLDMwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKzxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxoMz5Db250cmlidXRpb25zPC9oMz4KKworPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCittYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCitDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+CisKKzxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgorb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKK2hvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKK3RvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCitwcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgordGhlIENQTC48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlNTNhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACitzb3VyY2UuZXh0ZXJuYWx0b29scy5qYXIgPSBFeHRlcm5hbCBUb29scy8KKworc291cmNlLmxpYi9hbnRidWlsZGVyLmphciA9IEFudCBCdWlsZGVyCisKK3NyYy5pbmNsdWRlcz1hYm91dC5odG1sCisKK2Jpbi5pbmNsdWRlcyA9IGljb25zLyxcCisJCS5vcHRpb25zLFwKKwkJcGx1Z2luLnByb3BlcnRpZXMsXAorCQlwbHVnaW4ueG1sLFwKKwkJYWJvdXQuaHRtbCxcCisJCSouamFyLFwKKwkJbGliLyouamFyCisJCQkJCitqYXJzLmNvbXBpbGUub3JkZXI9ZXh0ZXJuYWx0b29scy5qYXIsbGliL2FudGJ1aWxkZXIuamFyCitqYXJzLmV4dHJhLmNsYXNzcGF0aD0uLi9vcmcuYXBhY2hlLmFudC9hbnQuamFyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2J1aWxkbm90ZXMuaHRtbCBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvYnVpbGRub3Rlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NWE2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2J1aWxkbm90ZXMuaHRtbApAQCAtMCwwICsxLDM5IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJCdWlsZCI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+CisgICA8dGl0bGU+RWNsaXBzZSBQbGF0Zm9ybSBSZWxlYXNlIE5vdGVzIC0gV29ya2JlbmNoPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgorRXh0ZXJuYWwgVG9vbHM8L2gxPgorRWNsaXBzZSBJbnRlZ3JhdGlvbiBCdWlsZCAyMDAyMDUwNworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+CitBUEkgY2hhbmdlczwvaDM+CisKKzxoMz4KK0FQSSBhZGRpdGlvbnM8L2gzPgorCis8aDM+CitPdGhlciBoaWdobGlnaHRzPC9oMz4KKworPGgyPgorS25vd24gZGVmaWNpZW5jaWVzPC9oMj4KKworPGgyPgorUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9idWdsaXN0LmNnaT9idWdfc3RhdHVzPVJFU09MVkVEJmJ1Z19zdGF0dXM9VkVSSUZJRUQmYnVnX3N0YXR1cz1DTE9TRUQmY2hmaWVsZD1idWdfc3RhdHVzJmNoZmllbGRmcm9tPTIwMDIlMkYwNCUyRjMwJmNoZmllbGR0bz0yMDAyJTJGMDUlMkYwNyZwcm9kdWN0PVBsYXRmb3JtJmNvbXBvbmVudD1VSSZjbWR0eXBlPWRvaXQmJm9yZGVyPUJ1ZytOdW1iZXIiPkNsaWNrCitoZXJlPC9hPiB0byBzZWUgUFJzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgUkVTT0xWRUQsIFZFUklGSUVEIG9yIENMT1NFRAorYmV0d2VlbiAyMDAyLzA0LzMwIGFuZCAyMDAyLzA1LzA3LgorPHA+Cis8aHIgU0laRT0wIFdJRFRIPSIxMDAlIj4KKzxicj4mbmJzcDsKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jbGNsMTYvY2xlYXIuZ2lmIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL2NsY2wxNi9jbGVhci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1ODMyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jbGNsMTYvY2xlYXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jbGNsMTYvaGlkZV9zaG93X3RyZWUuZ2lmIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL2NsY2wxNi9oaWRlX3Nob3dfdHJlZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4YzdlYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jbGNsMTYvaGlkZV9zaG93X3RyZWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd19zZWxlY3RlZF90ZXh0LmdpZiBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd19zZWxlY3RlZF90ZXh0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTllYjkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL2NsY2wxNi9zaG93X3NlbGVjdGVkX3RleHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jdG9vbDE2L2V4dGVybmFsX3Rvb2xzLmdpZiBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jdG9vbDE2L2V4dGVybmFsX3Rvb2xzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTMzYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL2N0b29sMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jdmlldzE2L2xvZ19jb25zb2xlX3ZpZXcuZ2lmIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL2N2aWV3MTYvbG9nX2NvbnNvbGVfdmlldy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwMGFjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9jdmlldzE2L2xvZ19jb25zb2xlX3ZpZXcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9kdG9vbDE2L2V4dGVybmFsX3Rvb2xzLmdpZiBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9kdG9vbDE2L2V4dGVybmFsX3Rvb2xzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWU1OTJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL2R0b29sMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9ldG9vbDE2L2V4dGVybmFsX3Rvb2xzLmdpZiBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9ldG9vbDE2L2V4dGVybmFsX3Rvb2xzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ3MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL2V0b29sMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9ldmlldzE2L2xvZ19jb25zb2xlX3ZpZXcuZ2lmIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL2V2aWV3MTYvbG9nX2NvbnNvbGVfdmlldy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2ZmZmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9ldmlldzE2L2xvZ19jb25zb2xlX3ZpZXcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9hbnRfZmlsZS5naWYgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2ljb25zL2Z1bGwvb2JqMTYvYW50X2ZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTQ1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2ljb25zL2Z1bGwvb2JqMTYvYW50X2ZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9idWlsZGVyLmdpZiBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9idWlsZGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGU3YmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL29iajE2L2J1aWxkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc3BhdGguZ2lmIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL29iajE2L2NsYXNzcGF0aC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2NmZjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc3BhdGguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9leHRlcm5hbF90b29scy5naWYgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2ljb25zL2Z1bGwvb2JqMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzNiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2ljb25zL2Z1bGwvb2JqMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9pbnZhbGlkX2J1aWxkX3Rvb2wuZ2lmIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL29iajE2L2ludmFsaWRfYnVpbGRfdG9vbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0MDIwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9pbnZhbGlkX2J1aWxkX3Rvb2wuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9qYXJfbF9vYmouZ2lmIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL29iajE2L2phcl9sX29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlMDRlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi9qYXJfbF9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZiBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI3NjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9pY29ucy9mdWxsL29iajE2L3R5cGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC93aXpiYW4vYW50X3dpei5naWYgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2ljb25zL2Z1bGwvd2l6YmFuL2FudF93aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDk5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2ljb25zL2Z1bGwvd2l6YmFuL2FudF93aXouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvaWNvbnMvZnVsbC93aXpiYW4vZXh0X3Rvb2xzX3dpei5naWYgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2ljb25zL2Z1bGwvd2l6YmFuL2V4dF90b29sc193aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhODYzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2ljb25zL2Z1bGwvd2l6YmFuL2V4dF90b29sc193aXouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvbGliLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2xpYi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZGRhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL2xpYi8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMiBAQAorYW50YnVpbGRlci5qYXIKK2FudGJ1aWxkZXIuamFyLmJpbi5sb2cKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YmM3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKK1BsdWdpbi5uYW1lID0gRXh0ZXJuYWwgVG9vbHMKK1BsdWdpbi5wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworUG9wdXBNZW51LnJ1bkFudCA9IFJ1biAmQW50Li4uCitQb3B1cE1lbnUucnVuQW50VGlwID0gUnVuIEFudCBXaXRoIFRoZSBTZWxlY3RlZCBGaWxlCitBY3Rpb25TZXQuZXh0ZXJuYWxUb29scyA9IEV4dGVybmFsIFRvb2xzCitBY3Rpb24uZXh0ZXJuYWxUb29scyA9ICZFeHRlcm5hbCBUb29scworQWN0aW9uLmV4dGVybmFsVG9vbHNUaXAgPSBSdW4gb3IgQ29uZmlndXJlIEV4dGVybmFsIFRvb2xzCitQcm9wZXJ0eVBhZ2UuZXh0ZXJuYWxUb29sc0J1aWxkZXJzID0gRXh0ZXJuYWwgVG9vbHMgQnVpbGRlcnMKK0NhdGVnb3J5LmV4dGVybmFsVG9vbHMgPSBFeHRlcm5hbCBUb29scworVmlldy5sb2dDb25zb2xlID0gTG9nIENvbnNvbGUKK1ByZWZlcmVuY2VQYWdlLnRvb2xzUHJlZmVyZW5jZXMgPSBFeHRlcm5hbCBUb29scworUHJlZmVyZW5jZVBhZ2UuYW50UHJlZmVyZW5jZXMgPSBBbnQKK01lbnUucnVuID0gJlJ1bgorQnVpbGRlci5leHRlcm5hbFRvb2xzID0gSW50ZWdyYXRlZCBFeHRlcm5hbCBUb29scyBCdWlsZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyY2Q2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3BsdWdpbi54bWwKQEAgLTAsMCArMSwxMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cGx1Z2luCisgICBpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIKKyAgIG5hbWU9IiVQbHVnaW4ubmFtZSIKKyAgIHZlcnNpb249IjIuMS4wIgorICAgcHJvdmlkZXItbmFtZT0iJVBsdWdpbi5wcm92aWRlck5hbWUiCisgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLkV4dGVybmFsVG9vbHNQbHVnaW4iPgorCisgICA8cnVudGltZT4KKyAgICAgIDxsaWJyYXJ5IG5hbWU9ImV4dGVybmFsdG9vbHMuamFyIj4KKyAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgorICAgICAgPC9saWJyYXJ5PgorICAgPC9ydW50aW1lPgorICAgPHJlcXVpcmVzPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUueGVyY2VzIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW50LmNvcmUiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+CisgICA8L3JlcXVpcmVzPgorCisKKzwhLS0gZXh0ZW5zaW9uIHBvaW50IGRlZmluaXRpb25zIC0tPgorCis8IS0tIEV4dGVuc2lvbnMgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuYnVpbGRlcnMiCisJCWlkPSJFeHRlcm5hbFRvb2xCdWlsZGVyIgorCQluYW1lPSIlQnVpbGRlci5leHRlcm5hbFRvb2xzIj4KKwkJPGJ1aWxkZXI+IAorCQkJPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5jb3JlLkV4dGVybmFsVG9vbHNCdWlsZGVyIi8+IAorCQk8L2J1aWxkZXI+IAorCTwvZXh0ZW5zaW9uPgorCisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisJCTxvYmplY3RDb250cmlidXRpb24KKwkJCWlkPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLlJ1bkFudCIKKwkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKKwkJCWFkYXB0YWJsZT0idHJ1ZSIKKwkJCW5hbWVGaWx0ZXI9IioueG1sIj4KKwkJCTxhY3Rpb24KKwkJCQlpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5SdW5BbnRBY3Rpb24iCisJCQkJbGFiZWw9IiVQb3B1cE1lbnUucnVuQW50IgorCQkJCXRvb2x0aXA9IiVQb3B1cE1lbnUucnVuQW50VGlwIgorCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCisJCQkJZW5hYmxlc0Zvcj0iMSIKKwkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aS5BbnRSdW5BY3Rpb25EZWxlZ2F0ZSI+CisJCQk8L2FjdGlvbj4KKwkJPC9vYmplY3RDb250cmlidXRpb24+CQkJCisJPC9leHRlbnNpb24+CisKKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KKwkJPGFjdGlvblNldAorCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuRXh0ZXJuYWxUb29sc1NldCIKKwkJCWxhYmVsPSIlQWN0aW9uU2V0LmV4dGVybmFsVG9vbHMiCisJCQl2aXNpYmxlPSJ0cnVlIj4KKwkJCTxtZW51IGlkPSJvcmcuZWNsaXBzZS51aS5ydW4iIAorCQkJCWxhYmVsPSIlTWVudS5ydW4iIAorCQkJCXBhdGg9ImFkZGl0aW9ucyI+IAorCQkJCTxzZXBhcmF0b3IgbmFtZT0iRXh0ZXJuYWxUb29sc0dyb3VwIi8+IAorCQkJPC9tZW51PiAKKwkJCTxhY3Rpb24KKwkJCQlpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xBY3Rpb24iCisJCQkJbGFiZWw9IiVBY3Rpb24uZXh0ZXJuYWxUb29scyIKKwkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkucnVuL0V4dGVybmFsVG9vbHNHcm91cCIKKwkJCQl0b29sYmFyUGF0aD0iTm9ybWFsL2FkZGl0aW9ucyIKKwkJCQlkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZHRvb2wxNi9leHRlcm5hbF90b29scy5naWYiCisJCQkJaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L2V4dGVybmFsX3Rvb2xzLmdpZiIKKwkJCQlob3Zlckljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9leHRlcm5hbF90b29scy5naWYiCisJCQkJdG9vbHRpcD0iJUFjdGlvbi5leHRlcm5hbFRvb2xzVGlwIgorCQkJCXB1bGxkb3duPSJ0cnVlIgorCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpLkV4dGVybmFsVG9vbHNBY3Rpb24iPgorCQkJPC9hY3Rpb24+CisJCTwvYWN0aW9uU2V0PgorCTwvZXh0ZW5zaW9uPgorCisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+CisJCTxwYWdlCisJCQlpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5wcm9wZXJ0eXBhZ2VzLkJ1aWxkZXJQcm9wZXJ0eVBhZ2UiCisJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCisJCQlhZGFwdGFibGU9InRydWUiCisJCQluYW1lPSIlUHJvcGVydHlQYWdlLmV4dGVybmFsVG9vbHNCdWlsZGVycyIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpLkJ1aWxkZXJQcm9wZXJ0eVBhZ2UiPgorCQkJPGZpbHRlciBuYW1lPSJvcGVuIiB2YWx1ZT0idHJ1ZSIvPiAKKwkJPC9wYWdlPgorCTwvZXh0ZW5zaW9uPgorCisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKwkJPHBhZ2UgCisJCQlpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5Ub29sc1ByZWZlcmVuY2VQYWdlIiAKKwkJCW5hbWU9IiVQcmVmZXJlbmNlUGFnZS50b29sc1ByZWZlcmVuY2VzIgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwudWkuVG9vbHNQcmVmZXJlbmNlUGFnZSI+CisJCTwvcGFnZT4KKwkJPHBhZ2UgCisJCQlpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BbnRQcmVmZXJlbmNlUGFnZSIgCisJCQluYW1lPSIlUHJlZmVyZW5jZVBhZ2UuYW50UHJlZmVyZW5jZXMiCisJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC51aS5BbnRQcmVmZXJlbmNlUGFnZSIKKwkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLlRvb2xzUHJlZmVyZW5jZVBhZ2UiPgorCQk8L3BhZ2U+CisJPC9leHRlbnNpb24+CisKKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+CisJCTxjYXRlZ29yeSAKKwkJCWlkPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLnZpZXdzIgorCQkJbmFtZT0iJUNhdGVnb3J5LmV4dGVybmFsVG9vbHMiPgorCQk8L2NhdGVnb3J5PgorCQk8dmlldworCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuTG9nQ29uc29sZVZpZXciCisJICAJCW5hbWU9IiVWaWV3LmxvZ0NvbnNvbGUiCisJCQlpY29uPSJpY29ucy9mdWxsL2N2aWV3MTYvbG9nX2NvbnNvbGVfdmlldy5naWYiCisJCQlmYXN0Vmlld1dpZHRoUmF0aW89IjAuNzUiCisJCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy52aWV3cyIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpLkxvZ0NvbnNvbGVWaWV3Ij4KKwkJPC92aWV3PgorCTwvZXh0ZW5zaW9uPgorCisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzIj4KKyAgICAgCTxleHRyYUNsYXNzcGF0aEVudHJ5CisgICAgICAgICAJbGlicmFyeT0ibGliL2FudGJ1aWxkZXIuamFyIj4KKyAgICAgIAk8L2V4dHJhQ2xhc3NwYXRoRW50cnk+CisgICAgPC9leHRlbnNpb24+CisKKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzMmZkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvc2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4uIj4KKworCTxwcm9wZXJ0eSBuYW1lPSJib290Y2xhc3NwYXRoIiB2YWx1ZT0iIi8+CisKKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkIj4KKwkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIvPgorCQk8YW50Y2FsbCB0YXJnZXQ9ImxpYi9hbnRidWlsZGVybGliLmphciIvPgorCQk8YW50Y2FsbCB0YXJnZXQ9InJlZnJlc2giLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+CisJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uLnN1ZmZpeCIgdmFsdWU9Il8yLjEuMCIvPgorCQk8cHJvcGVydHkgbmFtZT0iZnVsbC5uYW1lIiB2YWx1ZT0iJHtwbHVnaW59JHt2ZXJzaW9uLnN1ZmZpeH0iLz4KKwkJPHByb3BlcnR5IG5hbWU9InRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS90ZW1wLmZvbGRlciIvPgorCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgorCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KKwkJPHByb3BlcnR5IG5hbWU9IndpbjMyLmphciIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2Uuc3d0LndpbjMyL3dzL3dpbjMyL3N3dC5qYXIiLz4KKwkJPHByb3BlcnR5IG5hbWU9Imd0ay5qYXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLnN3dC5ndGsvd3MvZ3RrL3N3dC5qYXIiLz4KKwkJPHByb3BlcnR5IG5hbWU9Im1vdGlmLmphciIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2Uuc3d0Lm1vdGlmL3dzL21vdGlmL3N3dC5qYXIiLz4KKwkJPGF2YWlsYWJsZSBmaWxlPSIke3dpbjMyLmphcn0iIHByb3BlcnR5PSJzd3QuamFyIiB2YWx1ZT0iJHt3aW4zMi5qYXJ9Ii8+CisJCTxhdmFpbGFibGUgZmlsZT0iJHtndGsuamFyfSIgcHJvcGVydHk9InN3dC5qYXIiIHZhbHVlPSIke2d0ay5qYXJ9Ii8+CisJCTxhdmFpbGFibGUgZmlsZT0iJHttb3RpZi5qYXJ9IiBwcm9wZXJ0eT0ic3d0LmphciIgdmFsdWU9IiR7bW90aWYuamFyfSIvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KKwkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImxpYi9hbnRidWlsZGVybGliLmphciIgZGVwZW5kcz0iaW5pdCI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudGJ1aWxkZXJsaWIuamFyLmJpbiIvPgorCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudGJ1aWxkZXJsaWIuamFyLmJpbiIvPgorCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50YnVpbGRlcmxpYi5qYXIuYmluIi8+CisJCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+CisJCTxqYXZhYyB0YXJnZXQ9IjEuMyIgc291cmNlPSIxLjMiIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRidWlsZGVybGliLmphci5iaW4iIGZhaWxvbmVycm9yPSJmYWxzZSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJvbiIgaW5jbHVkZUFudFJ1bnRpbWU9Im5vIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiBjbGFzc3BhdGg9IiR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3J1bnRpbWUuamFyOyR7YmFzZWRpcn0vLi4vb3JnLmFwYWNoZS5hbnQvYW50Lmphcjske2Jhc2VkaXJ9Ly4uL29yZy5hcGFjaGUueGVyY2VzL3hlcmNlc0ltcGwuamFyOyR7YmFzZWRpcn0vLi4vb3JnLmFwYWNoZS54ZXJjZXMveG1sUGFyc2VyQVBJcy5qYXI7JHtiYXNlZGlyfS9iaW47JHtiYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5jb3JlLmJvb3QvYm9vdC5qYXI7JHtzd3QuamFyfTske2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLmpmYWNlL2pmYWNlLmphcjske2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC93b3JrYmVuY2guamFyOyR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2UuYW50LmNvcmUvYmluIj4KKwkJCTxzcmMgcGF0aD0iQW50IEJ1aWxkZXIvIi8+CisJCTwvamF2YWM+CisJCTwhLS0gY29weSBuZWNlc3NhcnkgcmVzb3VyY2VzIC0tPgorCQk8Y29weSB0b2Rpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudGJ1aWxkZXJsaWIuamFyLmJpbiI+CisJCQk8ZmlsZXNldCBkaXI9IkFudCBCdWlsZGVyLyIgZXhjbHVkZXM9IioqLyouamF2YSIvPgorCQk8L2NvcHk+CisJCTxta2RpciBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliIi8+CisJCTxqYXIgamFyZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIvYW50YnVpbGRlci5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRidWlsZGVybGliLmphci5iaW4iLz4KKwkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0Ij4KKwkJPGRlbGV0ZSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9hbnRidWlsZGVyLmphciIvPgorCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0icmVmcmVzaCIgZGVwZW5kcz0iaW5pdCIgaWY9ImVjbGlwc2UucnVubmluZyI+CisJCTxlY2xpcHNlLnJlZnJlc2hMb2NhbCByZXNvdXJjZT0iJHtwbHVnaW59IiBkZXB0aD0iaW5maW5pdGUiLz4KKwk8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9zY3JpcHRzL2J1aWxkU2VsZkhvc3RpbmdKQVJzLnhtbCBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvc2NyaXB0cy9idWlsZFNlbGZIb3N0aW5nSkFScy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMjM0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvc2NyaXB0cy9idWlsZFNlbGZIb3N0aW5nSkFScy54bWwKQEAgLTAsMCArMSwxNCBAQAorPHByb2plY3QgbmFtZT0iZXhwb3J0cGx1Z2lucyIgZGVmYXVsdD0iQ3JlYXRlIGV4dHJhIEpBUnMiIGJhc2VkaXI9Ii4iPgorCTx0YXJnZXQgbmFtZT0iaW5pdCI+CisJCTx0c3RhbXAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJDcmVhdGUgZXh0cmEgSkFScyIgZGVwZW5kcz0iaW5pdCI+CisJCTxhbnQgYW50ZmlsZT0ic2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbCIgZGlyPSIuLi8uLi9vcmcuZWNsaXBzZS5hbnQuY29yZSIgdGFyZ2V0PSJjbGVhbiIvPgorCQk8YW50IGFudGZpbGU9InNjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwiIGRpcj0iLi4vLi4vb3JnLmVjbGlwc2UuYW50LmNvcmUiIHRhcmdldD0ibGliL2FudHN1cHBvcnRsaWIuamFyIi8+CisJCTxhbnQgYW50ZmlsZT0ic2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbCIgZGlyPSIuLi8uLi9vcmcuZWNsaXBzZS5hbnQuY29yZSIgdGFyZ2V0PSJyZWZyZXNoIi8+CisJCTxhbnQgYW50ZmlsZT0ic2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbCIgZGlyPSIuLi8uLi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzIiB0YXJnZXQ9ImNsZWFuIi8+CisJCTxhbnQgYW50ZmlsZT0ic2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbCIgZGlyPSIuLi8uLi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzIiB0YXJnZXQ9ImxpYi9hbnRidWlsZGVybGliLmphciIvPgorCQk8YW50IGFudGZpbGU9InNjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwiIGRpcj0iLi4vLi4vb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIgdGFyZ2V0PSJyZWZyZXNoIi8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Mzc0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbApAQCAtMCwwICsxLDQwIEBACis8IS0tIEV4cG9ydCBhIGphciBvZiAuY2xhc3MgZmlsZXMgZm9yIHRoZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzIEVjbGlwc2UgcGx1Zy1pbgorICAgICBhbG9uZyB3aXRoIG90aGVyIGltcG9ydGFudCBwbHVnaW4gZmlsZXMgdG8gdGhlICJwbHVnaW4tZXhwb3J0IiBzdWJkaXJlY3RvcnkKKyAgICAgb2YgdGhlIHRhcmdldCBFY2xpcHNlIGluc3RhbGxhdGlvbiAtLT4KKzxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMiIGRlZmF1bHQ9ImV4cG9ydCIgYmFzZWRpcj0iLi4iPgorCisJPCEtLSBTZXQgdGhlIHRpbWVzdGFtcCBhbmQgaW1wb3J0YW50IHByb3BlcnRpZXMgLS0+CisJPHRhcmdldCBuYW1lPSJpbml0Ij4KKwkJPHRzdGFtcC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iLi4vLi4vcGx1Z2luLWV4cG9ydCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc3QiICB2YWx1ZT0iJHtkZXN0ZGlyfS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzXzIuMS4wIiAvPgorCTwvdGFyZ2V0PgorCisJPCEtLSBDcmVhdGUgdGhlIGphciBvZiAuY2xhc3MgZmlsZXMsIGFuZCBjb3B5IG90aGVyIGltcG9ydGFudCBmaWxlcyB0byBleHBvcnQgZGlyIC0tPgorCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJpbml0Ij4KKwkJPG1rZGlyIGRpcj0iJHtkZXN0ZGlyfSIgLz4KKwkJPGRlbGV0ZSBkaXI9IiR7ZGVzdH0iIC8+CisJCTxta2RpciBkaXI9IiR7ZGVzdH0iIC8+CisJCTxkZWxldGUgZGlyPSIke2Rlc3R9L2xpYiIvPgorCQk8bWtkaXIgZGlyPSIke2Rlc3R9L2xpYiIvPgorCQk8amFyIAorCQkJamFyZmlsZT0iJHtkZXN0fS9leHRlcm5hbHRvb2xzLmphciIKKwkJCWJhc2VkaXI9ImJpbiIKKwkJLz4KKwkJPCEtLSBDcmVhdGUgdGhlIHNvdXJjZSB6aXAgLS0+CisJCTx6aXAgemlwZmlsZT0iJHtkZXN0fS9leHRlcm5hbHRvb2xzc3JjLnppcCI+CisJCQk8ZmlsZXNldCBkaXI9IkFudCBCdWlsZGVyIi8+CisJCQk8ZmlsZXNldCBkaXI9IkV4dGVybmFsIFRvb2xzIi8+CisJCTwvemlwPgorCQk8Y29weSBmaWxlPSJwbHVnaW4ueG1sIiB0b2Rpcj0iJHtkZXN0fSIvPgorCQk8Y29weSBmaWxlPSJwbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7ZGVzdH0iLz4KKwkJPGNvcHkgZmlsZT0iLmNsYXNzcGF0aCIgdG9kaXI9IiR7ZGVzdH0iLz4KKwkJPGNvcHkgZmlsZT0iLm9wdGlvbnMiIHRvZGlyPSIke2Rlc3R9Ii8+CisJCTxhbnQgYW50ZmlsZT0ic2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbCIgdGFyZ2V0PSJidWlsZCIvPgorCQk8Y29weSBmaWxlPSJsaWIvYW50YnVpbGRlci5qYXIiIHRvZGlyPSIke2Rlc3R9L2xpYiIvPgorCQk8Y29weSB0b2Rpcj0iJHtkZXN0fS9pY29ucyI+CisJCQk8ZmlsZXNldCBkaXI9Imljb25zIiAvPgorCQk8L2NvcHk+CQkKKwk8L3RhcmdldD4KKwkKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvc2NyaXB0cy91cGRhdGVUYXJnZXQueG1sIGIvb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy9zY3JpcHRzL3VwZGF0ZVRhcmdldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiMDgzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvc2NyaXB0cy91cGRhdGVUYXJnZXQueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzwhLS0gCisKKwlGb3IgdXNlIGluIGRldmVsb3BtZW50IG9mIHRoZSBFeHRlcm5hbCB0b29scyBwbHVnaW4gCisJVGhpcyBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gdXBkYXRlIGEgdGFyZ2V0IGZvciB0ZXN0aW5nL2RlYnVnZ2luZworCUV4cG9ydCBhIGphciBvZiAuY2xhc3MgZmlsZXMgZm9yIHRoZSBvcmcuZWNsaXBzZS5hbnQuY29yZSBFY2xpcHNlIHBsdWdpbgorICAgIGFsb25nIHdpdGggb3RoZXIgaW1wb3J0YW50IHBsdWdpbiBmaWxlcyB0byB0aGUgInBsdWdpbi1leHBvcnQiIHN1YmRpcmVjdG9yeQorICAgIG9mIHRoZSB0YXJnZXQgRWNsaXBzZSBpbnN0YWxsYXRpb24KKwlBcyB3ZWxsIHRoZSBleHBvcnQgb2YgdGhlIHBsdWdpbiBpcyBjb3BpZWQgdG8gYSB0YXJnZXQgaW5zdGFsbGF0aW9uLgorIC0tPgorPHByb2plY3QgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIgZGVmYXVsdD0iZXhwb3J0IiBiYXNlZGlyPSIuLiI+CisKKwk8IS0tIFNldCB0aGUgdGltZXN0YW1wIGFuZCBpbXBvcnRhbnQgcHJvcGVydGllcyAtLT4KKwk8dGFyZ2V0IG5hbWU9ImluaXQiPgorCQk8dHN0YW1wLz4KKwkJPHByb3BlcnR5IG5hbWU9ImJvb3RjbGFzc3BhdGgiIHZhbHVlPSIiLz4KKwkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iLi4vLi4vcGx1Z2luLWV4cG9ydCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InBsdWdpbk5hbWUiIHZhbHVlPSAib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29sc18yLjEuMCIvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzdEJpbiIgIHZhbHVlPSIke2Rlc3RkaXJ9LyR7cGx1Z2luTmFtZX0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0U3JjIiAgdmFsdWU9IiR7ZGVzdGRpcn0vb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlL3NyYy9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzXzIuMS4wIiAvPgorCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Rlc3RkaXJ9L3RlbXAuZm9sZGVyIi8+CisKKwkJPHByb3BlcnR5IG5hbWU9ImN1cnJlbnRCdWlsZCIgdmFsdWU9Ii4uLy4uL0RlYnVnZ2VyL0FudC9lY2xpcHNlIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50QnVpbGRQbHVnaW5zIiB2YWx1ZT0iJHtjdXJyZW50QnVpbGR9L3BsdWdpbnMvJHtwbHVnaW5OYW1lfSIvPgorCTwvdGFyZ2V0PgorCisJPCEtLSBDcmVhdGUgdGhlIGphciBvZiAuY2xhc3MgZmlsZXMsIGFuZCBjb3B5IG90aGVyIGltcG9ydGFudCBmaWxlcyB0byBleHBvcnQgZGlyIC0tPgorCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJpbml0Ij4KKwkJPG1rZGlyIGRpcj0iJHtkZXN0ZGlyfSIgLz4KKwkJPGRlbGV0ZSBkaXI9IiR7ZGVzdEJpbn0iIC8+CisJCTxta2RpciBkaXI9IiR7ZGVzdEJpbn0iIC8+CisJCTxkZWxldGUgZGlyPSIke2Rlc3RTcmN9IiAvPgorCQk8bWtkaXIgZGlyPSIke2Rlc3RTcmN9IiAvPgorCQk8ZGVsZXRlIGRpcj0iJHtkZXN0QmlufS9saWIiIC8+CisJCTxqYXIgCisJCQlqYXJmaWxlPSIke2Rlc3RCaW59L2V4dGVybmFsdG9vbHMuamFyIgorCQkJYmFzZWRpcj0iYmluIgorCQkJZXhjbHVkZXM9ImJpbi9vcmcvZWNsaXBzZS91aS9leHRlcm5hbHRvb2xzL2ludGVybmFsL3VpL2FudCIKKwkJLz4KKwkJPCEtLSBDcmVhdGUgdGhlIHNvdXJjZSB6aXAgLS0+CisJCTx6aXAgemlwZmlsZT0iJHtkZXN0U3JjfS9leHRlcm5hbHRvb2xzc3JjLnppcCI+CisJCQk8ZmlsZXNldCBkaXI9IkV4dGVybmFsIFRvb2xzIi8+CisJCTwvemlwPgorCQk8Y29weSBmaWxlPSJwbHVnaW4ueG1sIiB0b2Rpcj0iJHtkZXN0QmlufSIvPgorCQk8Y29weSBmaWxlPSJwbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7ZGVzdEJpbn0iLz4KKwkJPGNvcHkgZmlsZT0iYWJvdXQuaHRtbCIgdG9kaXI9IiR7ZGVzdEJpbn0iLz4KKwkJPGNvcHkgZmlsZT0iLmNsYXNzcGF0aCIgdG9kaXI9IiR7ZGVzdEJpbn0iLz4KKwkJPGNvcHkgZmlsZT0iLm9wdGlvbnMiIHRvZGlyPSIke2Rlc3RCaW59Ii8+CisJCQorCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudGJ1aWxkZXIuamFyLmJpbiIvPgorCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50YnVpbGRlci5qYXIuYmluIi8+CisJCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+CisJCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50YnVpbGRlci5qYXIuYmluIiBmYWlsb25lcnJvcj0iZmFsc2UiIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0ib24iIGluY2x1ZGVBbnRSdW50aW1lPSJubyIgYm9vdGNsYXNzcGF0aD0iJHtib290Y2xhc3NwYXRofSIgY2xhc3NwYXRoPSIke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS9ydW50aW1lLmphcjske2Jhc2VkaXJ9Ly4uL29yZy5hcGFjaGUuYW50L2FudC5qYXI7JHtiYXNlZGlyfS8uLi9vcmcuYXBhY2hlLnhlcmNlcy94ZXJjZXNJbXBsLmphcjske2Jhc2VkaXJ9Ly4uL29yZy5hcGFjaGUueGVyY2VzL3htbFBhcnNlckFQSXMuamFyOyR7YmFzZWRpcn0vYmluOyR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2UuY29yZS5ib290L2Jvb3QuamFyOyR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2Uuc3d0LndpbjMyL3dzL3dpbjMyL3N3dC5qYXI7JHtiYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5hbnQuY29yZS9iaW4iPgorCQkJPHNyYyBwYXRoPSJBbnQgQnVpbGRlci8iLz4KKwkJPC9qYXZhYz4KKwkJPCEtLSBjb3B5IGFueSBuZWNlc3NhcnkgcmVzb3VyY2VzIC0tPgorCQk8Y29weSB0b2Rpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudGJ1aWxkZXIuamFyLmJpbiI+CisJCQk8ZmlsZXNldCBkaXI9IkFudCBCdWlsZGVyLyIgZXhjbHVkZXM9IioqLyouamF2YSIvPgorCQk8L2NvcHk+CisJCTxta2RpciBkaXI9IiR7ZGVzdEJpbn0vbGliIi8+CisJCTxqYXIgamFyZmlsZT0iJHtkZXN0QmlufS9saWIvYW50YnVpbGRlci5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRidWlsZGVyLmphci5iaW4iLz4KKwkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+CisJCQorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iY29weSIgZGVwZW5kcz0iaW5pdCI+CisJCTxjb3B5IHRvZGlyPSIke2N1cnJlbnRCdWlsZFBsdWdpbnN9Ij4KKwkJCTxmaWxlc2V0IGRpcj0iJHtkZXN0QmlufSIvPgorCQk8L2NvcHk+CisJPC90YXJnZXQ+CisJCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3NjcmlwdHMvdXBkYXRlVGFyZ2V0cy54bWwgYi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzL3NjcmlwdHMvdXBkYXRlVGFyZ2V0cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkYTgyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMvc2NyaXB0cy91cGRhdGVUYXJnZXRzLnhtbApAQCAtMCwwICsxLDEyIEBACis8cHJvamVjdCBuYW1lPSJleHBvcnRwbHVnaW5zIiBkZWZhdWx0PSJleHBvcnQgdG8gcmVtb3RlIHRhcmdldHMiIGJhc2VkaXI9Ii4iPgorCTx0YXJnZXQgbmFtZT0iaW5pdCI+CisJCTx0c3RhbXAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJleHBvcnQgdG8gcmVtb3RlIHRhcmdldHMiIGRlcGVuZHM9ImluaXQiPgorCQk8YW50IGFudGZpbGU9InNjcmlwdHMvdXBkYXRlVGFyZ2V0LnhtbCIgZGlyPSIuLi8uLi9vcmcuZWNsaXBzZS5hbnQuY29yZSIgdGFyZ2V0PSJleHBvcnQiLz4KKwkJPGFudCBhbnRmaWxlPSJzY3JpcHRzL3VwZGF0ZVRhcmdldC54bWwiIGRpcj0iLi4vLi4vb3JnLmVjbGlwc2UuYW50LmNvcmUiIHRhcmdldD0iY29weSIvPgorCQk8YW50IGFudGZpbGU9InNjcmlwdHMvdXBkYXRlVGFyZ2V0LnhtbCIgZGlyPSIuLi8uLi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbFRvb2xzIiB0YXJnZXQ9ImV4cG9ydCIvPgorCQk8YW50IGFudGZpbGU9InNjcmlwdHMvdXBkYXRlVGFyZ2V0LnhtbCIgZGlyPSIuLi8uLi9vcmcuZWNsaXBzZS51aS5leHRlcm5hbFRvb2xzIiB0YXJnZXQ9ImNvcHkiLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4K